接口
接口(interface)定义了一个对象的行为规范,之定义规范不实现,由具体的对象来实现规范的细节
1、接口类型
在Go中,接口(interface)是一种类型,一种抽象的类型。
interface是一组method的集合,是duck-type programming的一种体现。接口做的事情就像是定义一个协议(规则)。
2、接口的定义
- 接口是一个或多个方法签名的集合
- 任何类型的方法集合中只有拥有该接口“对应的全部方法”签名,就表示它“实现”了该接口,无须在该类型上显式声明实现了哪个接口。这称为(structural Typing)
- 接口只有方法声明,没有实现,没有数据字段
- 接口可以匿名嵌入其他接口,或嵌入到结构中
- 对象赋值给接口时,会发生拷贝,而接口内部存储的是指向这个复制品的指针,既无法修改复制品的状态,也无法获取指针
- 只有当接口存储的类型和对象都为nil时,接口才等于nil
- 接口调用不会做receiver的自动转换
- 接口同样支持匿名字段方法
- 接口也可以实现类型OOP中的多态
- 空接口可以作为任何类型数据的容器
- 一个类型可实现多个接口
- 接口命名习惯以er结尾
每个接口由数个方法组成,接口的定义格式如下:
type 接口类型名 interface {
方法名1(参数列表1)返回值列表1
方法名2(参数列表2)返回值列表2
...
}
其中:
- 接口名:使用type将接口定义为自定义的类型名。Go语言中的接口在命名时,一般会在单词后面添加er,如有写操作的接口叫Writer,有字符串功能的接口叫Stringer等。接口名最好要能突出该接口的类型含义
- 方法名:当方法名首字母时大写且这个接口类型名首字母也时大写时,这个方法可以被接口所在的包(package)之外的代码访问
- 参数列表,返回值列表:参数列表和返回值列表中的参数变量名可以省略
3、实现接口的条件
一个对象只要全部实现了接口中的方法,那么就实现了这个接口。换句话说,接口就是一个需要实现的方法列表
4、类型与接口的关系
一个类型可以同时实现多个接口,而接口间彼此独立,不知道对方的实现。
5、空接口
空接口是指没有定义任何方法的接口。因此任何类型都实现了空接口。
空接口类型的变量可以存储任意类型的变量。
应用:
1. 空接口作为函数的参数(使用空接口实现可以接受任意类型的函数参数)
2. 空接口作为map的值(使用空接口实现可以保存任意值的字典)
类型断言:
接口值:一个接口的值(简称接口值)是由一个具体类型和具体类型的值两部分组成的。这两部分分别称为接口的动态类型和动态值
想要判断空接口中的值的时候就可以使用类型断言,其语法格式如下:
x.(T)
其中:
- x表示类型为interface{}的变量
- T表示断言x可能是的类型
该语法返回两个参数,第一个参数是x转换为T类型后的变量,第二个是一个布尔值,若为true则表示断言成功,为false则表示断言失败