11.1 接口

Kesa...大约 1 分钟

11.1 接口

接口定义一组方法,方法不含实现代码。

接口中不能有变量。

定义接口:

type Namer interface {
    Method1(param_list) return_type
    ...
}

一般只有一个方法的接口以er结尾(PrinterReaderWriterLoggerConverter ),er不适合适时用able结尾,I开头等。

接口默认零值为nil:

var ai Namer // ai: nil

接口是一个多字(multiword)结构:

image-20230504234830250
image-20230504234830250

method table ptr: 方法指针表,根据运行时反射构建。

当实现 Namer 接口类型变量赋值给 ai(receiver) 时,方法指针表就指向当前方法实现。

若另一个实现了Namer接口的变量赋值给ai时, receiver 值和方法表指针也会改变。

实现接口

  • 无需显式声明,接口被隐式实现,多个类型可以实现同一个接口。
  • 实现接口的类型,除了接口方法外,可以有其他方法
  • 一个类型可以实现多个接口
  • 接口是动态类型

11_1_interfaces.go

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