11.1 接口
...大约 1 分钟
11.1 接口
接口定义一组方法,方法不含实现代码。
接口中不能有变量。
定义接口:
type Namer interface {
    Method1(param_list) return_type
    ...
}
一般只有一个方法的接口以er结尾(Printer、Reader、Writer、Logger、Converter ),er不适合适时用able结尾,I开头等。
接口默认零值为nil:
var ai Namer // ai: nil
接口是一个多字(multiword)结构:

method table ptr: 方法指针表,根据运行时反射构建。
当实现 Namer 接口类型变量赋值给 ai(receiver) 时,方法指针表就指向当前方法实现。
若另一个实现了Namer接口的变量赋值给ai时, receiver 值和方法表指针也会改变。
实现接口:
- 无需显式声明,接口被隐式实现,多个类型可以实现同一个接口。
 - 实现接口的类型,除了接口方法外,可以有其他方法
 - 一个类型可以实现多个接口
 - 接口是动态类型
 
type Shaper interface {
	Area() float32
}
type Square struct {
	side float32
}
func (sq *Square) Area() float32 {
	return sq.side * sq.side
}
type Rectangle struct {
	length, width float32
}
func (r *Rectangle) Area() float32 {
	return r.width * r.length
}
func itf() {
	r := &Rectangle{5, 3}
	s := &Square{5}
	shapes := []Shaper{r, s}
	for i := range shapes {
		fmt.Println(shapes[i].Area())
	}
}
15
25
 Powered by  Waline  v2.15.2
