接口(interface)的定义
接口代表一种调用契约,是多个方法声明的集合。接口要实现的是做什么,而不关心如何做。接口最常见的使用场景是对包外提供访问,或预留扩展空间。
Go语言接口实现机制很简洁,只要目标类型方法集内包含接口声明的全部方法,就被视为实现了该接口,无需做显示声明,当然目标类型可实现多个接口。
其实接口也是一中结构,只是编译器会对其做出很多限制:
- 不能有字段
- 不能定义自己的方法
- 只能声明方法,不能实现
- 可嵌入其它接口类型
接口通常以er作为后缀,方法名是声明组成部分,但参数名可不同或省略。
package main
import(
"fmt"
)
type tester interface{ //方法
test()
string() string
}
type data struct{}
func (*data)test(){}
func (data)string()string{
return "Hello word"
}
func main(){
var d data
var t tester = &d
t.test()
fmt.Println(t.string())
}
如果接口没有任何方法声明,那么它就是一个空接口(interface{}),它的用途非常广泛可被赋值为任何类型的对象。接口变量默认值时nil,如果实现接口的类型支持可做相等运算。
package main
import(
"fmt"
)
func main(){
var a,b interface{}
fmt.Println(a == nil,a == b)
a,b = 10,10
fmt.Println(a == b)
}
输出:
true true
true
可以像匿名字段那样嵌入其它接口。目标类型方法集中必须拥有包含嵌入接口方法在内的全部方法才算实现了该接口。嵌入其它接口类型相当于将其声明的方法集导入。这就要去不能有同名方法,因为不支持重载。不能嵌入自身或循环嵌入这样会导致递归错误。接口可直接用于变量定义,或作为结构字段类型。