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