[TOC]
接口是一种由程序员来定义的类型,一个接口类型就是一组方法的集合,它规定了需要实现的所有方法。
## 接口定义
接口的定义格式
```go
type 接口类型名称 interface {
方法名(形参1, ...) (返回值1, ...)
...
}
```
>[info] **说明**
> - 接口类型名称:Go语言的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有关闭操作的接口叫closer等。接口名最好要能突出该接口的类型含义。
> - 方法名:当方法名首字母是大写且这个接口类型名首字母也是大写时,这个方法可以被接口所在的包(package)之外的代码访问。
> - 形参1、返回值1:形参1、返回值1中参数变量名可以省略
## 实现接口条件
接口就是规定了一个**需要实现的方法列表**,在 Go 语言中一个类型只要实现了接口中规定的所有方法,那么我们就称它实现了这个接口。
```go
// Penson 是人类的结构体
type Penson struct {
Name string
}
// Sing 是 Penson 结构体唱歌的方法
func (p Penson) Sing() {
fmt.Printf("%s优美动听的歌声~", p.Name)
}
// Singer 接口
type Singer interface {
Sing()
}
```
上述的案例就是 `Penson` 实现 `Singer` 接口。如果接口定义多个方法的话, `Penson` 也需要定义对应的方法才能实现到 `Singer` 接口
## 为什么需要使用接口
现在支付方式有微信、支付宝、银行卡等等,每个支付流程都不一样。各自开发一个二维码来收钱。对于客户而言,需要找对应的二维码才能进行支付,这种体验感不算太友好。
如果有一个万能二维码都可以付款的话,对于客户来说,这种体验感比较友好。在 Golang 语言中就是接口。
## 面向接口编程
编程过程很多时候可以使用到接口的。比如动作属性,很多类型都有这类动作的话,那么就可以实现到接口方式了。例如,支付方式、发声、跑步、睡觉和求面积体积等等
这里举例结账功能。微信、支付宝都有支付功能。这里创建一个结账接口,然后所有付款都可以对接进来结账的。后续有其他付款方式的话,结构体实现到支付的方法即可调用结账的接口来付款。
```go
// WeChat 是微信结构体
type WeChat struct {
ID int
User string
}
// Pay 是微信结构体的付款方法
func (w WeChat) Pay(f float64) {
fmt.Printf("%s用户微信扣款%.2f元\n", w.User, f)
}
// Alipay 是支付宝结构体
type Alipay struct {
ID int
User string
}
// Pay 是支付宝结构体的付款方法
func (a Alipay) Pay(f float64) {
fmt.Printf("%s用户支付宝扣款%.2f元\n", a.User, f)
}
// Payer 结账接口
type SettleAccounter interface {
Pay(float64)
}
func main() {
// 微信结构体赋值给w变量
w := WeChat{1, "jiaxzeng"}
// 定义结账类型变量
var s SettleAccounter
// 将微信结构体赋值给接口
s = w
// 接口调用微信结构体支付的方法
s.Pay(1.248)
// 支付宝结账方式
a := Alipay{2, "xiaodunan"}
var s2 SettleAccounter = a
s2.Pay(1.451)
}
// 运行结果:
// jiaxzeng用户微信扣款1.25元
// xiaodunan用户支付宝扣款1.45元
```
## 接口类型变量
那实现了接口又有什么用呢?一个接口类型的变量能够存储所有实现了该接口的类型变量。
```go
// 微信结构体赋值给w变量
w := WeChat{1, "jiaxzeng"}
// 定义结账类型变量
var s SettleAccounter
// 将微信结构体赋值给接口
s = w
// 接口调用微信结构体支付的方法
s.Pay(1.248)
// 支付宝结账方式
a := Alipay{2, "xiaodunan"}
var s2 SettleAccounter = a
s2.Pay(1.451)
```
>[info] 上述举例中 `WeChat` 和 `Alipay` 结构体均实现 `SettleAccounter` 接口,此时一个 `SettleAccounter` 类型的变量就能够接收 `WeChat` 和 `Alipay` 类型的变量。
- Golang简介
- 开发环境
- Golang安装
- 编辑器及快捷键
- vscode插件
- 第一个程序
- 基础数据类型
- 变量及匿名变量
- 常量与iota
- 整型与浮点型
- 复数与布尔值
- 字符串
- 运算符
- 算术运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 赋值运算符
- 流程控制语句
- 获取用户输入
- if分支语句
- for循环语句
- switch语句
- break_continue_goto语法
- 高阶数据类型
- pointer指针
- array数组
- slice切片
- slice切片扩展
- map映射
- 函数
- 函数定义和调用
- 函数参数
- 函数返回值
- 作用域
- 函数形参传递
- 匿名函数
- 高阶函数
- 闭包
- defer语句
- 内置函数
- fmt
- strconv
- strings
- time
- os
- io
- 文件操作
- 编码
- 字符与字节
- 字符串
- 读写文件
- 结构体
- 类型别名和自定义类型
- 结构体声明
- 结构体实例化
- 模拟构造函数
- 方法接收器
- 匿名字段
- 嵌套与继承
- 序列化
- 接口
- 接口类型
- 值接收者和指针接收者
- 类型与接口对应关系
- 空接口
- 接口值
- 类型断言
- 并发编程
- 基本概念
- goroutine
- channel
- select
- 并发安全
- 练习题
- 第三方库
- Survey
- cobra