11.6 使用方法集与接口

Kesa...大约 1 分钟

11.6 使用方法集与接口

在接口上调用方法时,必须有和方法定义时相同的接收者类型或者是可以根据具体类型 P 直接辨识的:

  • 指针方法可以通过指针调用
  • 值方法可以通过值调用
  • 接收者是值的方法可以通过指针调用,因为指针会首先被解引用
  • 接收者是指针的方法不可以通过值调用,因为存储在接口中的值没有地址

将一个值赋值给一个接口时,编译器会确保所有可能的接口方法都可以在此值上被调用,因此不正确的赋值在编译期就会失败。

Go 语言规范定义了接口方法集的调用规则:

  • 类型 *T 的可调用方法集包含接受者为 *TT 的所有方法集
  • 类型 T 的可调用方法集包含接受者为 T 的所有方法
  • 类型 T 的可调用方法集包含接受者为 *T 的方法

因为接口变量中存储的值是不可寻址的,所以不能调用接收者为指针的方法。

type Shaper2 interface {
	Area() float32
	Perimeter() float32
}

type Square2 struct {
	side float32
}

func (s *Square2) Area() float32 {
	return s.side * s.side
}

func (s Square2) Perimeter() float32 {
	return s.side * 4
}

func mthds() {
	s1 := Square2{2}
	s2 := &Square2{3}

	var shape Shaper2
	// Cannot use 's1' (type Square2) as the type Shaper2
	// Type does not implement 'Shaper2' as the
	// 'Area' method has a pointer receiver
	// shape = s1
	shape = s2
}

上次编辑于:
评论
  • 按正序
  • 按倒序
  • 按热度
Powered by Waline v2.15.2