本文适合初学者阅读
- 7.1 定义
- 接口代表一种契约, 是多个方法声明的集合.
- go接口实现机制很简洁, 只要目标类型方法集内包含接口声明的全部方法, 就视为实现了该接口,无须做显式声明. 当然, 目标类型可实现多个接口.
- 从内部实现来看,接口自身也是一种结构类型, 只是编译器会对其做出很多限制.
- 不能有字段
- 不能定义自己的方法
- 只有声明方法,不能实现
- 可嵌入其他接口类型 - 接口通常以er作为名称后缀, 方法名也是声明组成部分, 但参数名可不用或省略
package main
type tester interface {
test()
string() string
}
type data struct{}
func (*data) test() {}
func (data) string() string {
return ""
}
func main() {
var d data
// var t tester = d // 报错: data does not implement tester
// (test method has pointer receiver),
// tester 是个接口, 里面包含了两个方法,
//其中test方法的receiver要求使用指针参数,
//此时d不是指针参数, 所以会报错.
var t tester = &d
t.test()
println(t.string())
}
- 如果接口没有任何声明方法声明,那么就是一个空接口, 它可被赋值为任何类型的对象.
- 接口变量默认值是nil, 如果实现接口的类型支持, 可做相等运算.
- 可以像匿名字段那样, 嵌入其他接口, 目标类型方法集中必须拥有包含嵌入接口方法在内的全部方法才算实现了该接口.
嵌入其他接口类型, 相当于将其声明的方法集导入 . 这就要求不能有同名方法, 因为不支持重载,
不能嵌入 自身或循环嵌入, 会导致递归错误 .
支持匿名接口类型, 可直接用于变量定义 , 或作为结构字段类型,
- 接口有个重要的特性: 将对象赋值给接口变量时,会复制该对象, 解决方法就是将对象指针赋值给接口, 那么接口内存储的就是指针的复制品.
- 只有当接口变量内部的两个指针itab 和data都为nil时, 接口才等于nil, 正确的做法明确返回nil
- 7.3 类型转换
- 类型推断可将接口变量还原为原始类型, 或用来判断是否实现了某个更具体的接口类型.