方法集合
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;