跳到主要内容

方法集合

T 与 *T 的方法集合如何决定接口实现?​

  • method set: 一个类型可调用或可用于实现接口的方法集合;
  • T 方法集合: 包含 receiver 为 T 的方法;
  • *T 方法集合: 包含 receiver 为 T 和 *T 的方法;
  • 接口实现: 类型的方法集合覆盖接口方法集合, 即实现接口;
type N int

func (n N) Value() int {
return int(n)
}

func (n *N) Inc() {
*n = *n + 1
}
方法N 的方法集合*N 的方法集合
Value()包含包含
Inc()不包含包含
  • 自动取址边界: 可寻址的 n 能简写 n.Inc(),不代表 N 的方法集合包含 Inc;把 n 赋给要求 Inc() 的接口仍失败,必须传 &n;
type Incrementer interface { Inc() }
var n N
var inc Incrementer = &n
inc.Inc()
println(n) // 1
  • nil 指针边界: 指针类型满足接口不保证每个值都能成功执行方法;(*N)(nil) 调用需要解引用的 Inc 时仍会 panic;