golang之类型解析

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
因为不是总能获取一个值的地址,所以值的方法集只包括了使用值接收者实现的方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。