未初始化的嵌入式结构

我对这个 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>,但方法调用执行没有问题。引擎盖下发生了什么?


青春有我
浏览 154回答 2
2回答

莫回无

nil只要您不取消引用接收器本身,就可以使用接收器调用方法。这意味着以下作品游乐场:package mainimport (&nbsp; &nbsp; "fmt")type foo struct {&nbsp; &nbsp; val int}func (f *foo) Print() {&nbsp; &nbsp; fmt.Println("Receiver:", f)}func (f *foo) PrintVal() {&nbsp; &nbsp; fmt.Println("Val: ", f.val)}func main() {&nbsp; &nbsp; var f *foo&nbsp; &nbsp; f.Print()&nbsp; &nbsp; //f.PrintVal()}f.Print()工作没有问题,因为我们只是打印一个指针,我们不想取消引用它。但是,f.PrintVal尝试取消引用nil指针,导致恐慌。如有疑问,请记住此示例中的方法等效于将接收器作为第一个参数的函数:func Print(f *foo)func PrintVal(f *foo)这在方法声明下的规范中提到:方法的类型是以接收者为第一个参数的函数的类型。例如,方法 Scale 具有类型func(p *Point, factor float64)但是,以这种方式声明的函数不是方法。这清楚地表明接收器没有什么特别的,nil只要你不取消引用它就可以。

智慧大石

使用 nil-receiver 调用未初始化结构的方法。如果在使用该接收器的方法中,您会感到恐慌。使用 nil 接收器调用方法是有效的,并且该方法可以通过检查接收器是否为 nil 来修改其行为。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go