type T struct {}
func (*T) foo(){
fmt.Println("foo,")
}
func (T) bar() {
}
type S struct {
*T
}
s := S{}
_ = s.T.foo
s.T.foo()
var t *T
t.foo()
_ = s.bar
s.bar将被展开为(s.T).bar,而 s.T 是个空指针,解引用会 panic。而s.foo没有panic是因为T的方法集有foo(),而没有bar()
方法集规则如下:
Values Methods Receivers
T (t T) *T (t T) and (t *T)
Methods Receivers Values
(t T) T and *T (t *T) *T
因为不是总能获取一个值的地址,所以值的方法集只包括了使用值接收者实现的方法
有疑问加站长微信联系(非本文作者)