1,接口实现机制:只要目标方法集内包含接口声明的全部方法,就被视为实现了该接口,无需做显示声明。目标类型可以实现多个接口。
2,内部实现,接口自身也是一种结构类型
type iface struct {
tab *itab
data unsafe.Pointer
}
- 不能有字段
- 不能定义自己的方法。
- 只能声明方法,不能实现。
- 可嵌入其它接口类型。
3,接口通常以er作为接口后缀,方法名是声明组成部分,但参数名可不同或省略
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 error : data does not implements tester (test method has pointer receiver)
var t tester = &d
t.test()
fmt.Println(t.string())
}
4,如果接口没有任何方法,那么就是个空接口(interface{}),它的用途类似面向对象里的跟类型Object,可被赋值为任何类型的对象
5,可以像匿名字段那样,嵌入其它接口。目标类型方法集中必须拥有包含嵌入接口方法在内的全部方法,才算实现了该接口
type stringer interface {
string() string
}
type tester interface {
stringer
test()
}
type data struct {}
func (*data) test() {}
func (data) string() string {
return ""
}
func main(){
var d data
var t tester = &d
t.test()
fmt.Println(t.string())
}
6,超级接口变量可以隐式转换为子集,反过来不行
func pp(a stringer){
fmt.Println(a.string())
}
func main(){
var d data
var t tester = &d
pp(t) //隐式转换为子集接口
var s stringer = t //超集转化为子集
fmt.Println(s.string())
// var t2 tester = s //error
}
7,支持匿名接口类型,可直接用于变量定义,或作为结构字段类型
package main
import "fmt"
type data struct {}
func (data) string() string {
return ""
}
type node struct {
data interface { //匿名接口类型
string() string
}
}
func main(){
var t interface {
string() string
} = data{}
n := node{
data:t,
}
fmt.Println(n.data.string())
}