我对这个 go 代码有点困惑。我有一个带有嵌入式结构(内部)的结构(外部),但是当我初始化外部时,我故意让嵌入式结构未初始化。
type Inner struct {
value int
}
func (i *Inner) MyFunc() string {
return "inner"
}
func (i *Inner) OnlyInner() string {
return "only inner stuff"
}
type Outer struct {
*Inner
}
func (o *Outer) MyFunc() string {
return "outer"
}
func main() {
// embedded struct is *not* initialized
o := &Outer{}
fmt.Println(o.Inner)
fmt.Println(o.Inner.MyFunc())
fmt.Println(o.Inner.OnlyInner())
//fmt.Println(o.Inner.value)
}
输出:
<nil>
inner
only inner stuff
如果我取消注释最后一行(用o.Inner.value),我会得到一个 nil 指针取消引用错误。
这是怎么回事?有效的转到页面说(https://golang.org/doc/effective_go.html#embedding):
当我们嵌入一个类型时,该类型的方法成为外部类型的方法,但是当它们被调用时,方法的接收者是内部类型,而不是外部类型。
就我而言,内部类型似乎是<nil>,但方法调用执行没有问题。引擎盖下发生了什么?
青春有我
莫回无
智慧大石
随时随地看视频慕课网APP
相关分类