猿问

理解嵌套结构

我试图理解 go 中的嵌套结构,所以我做了一个小测试:(操场)


type A struct {

    a string

}


type B struct {

    A

    b string

}


func main() {

    b := B{A{"a val"}, "b val"}


    fmt.Printf("%T -> %v\n", b, b)   // B has a nested A and some values 

    // main.B -> {{a val} b val}


    fmt.Println("b.b ->", b.b)       // B's own value

    // b.b -> b val


    fmt.Println("b.A.a ->", b.A.a)   // B's nested value

    // b.a -> a val


    fmt.Println("b.a ->", b.a)       // B's nested value? or own value?

    // b.a -> a val

}

那么最后两行是如何以及为什么起作用的呢?他们是一样的吗?我应该使用哪个?


沧海一幻觉
浏览 177回答 1
1回答

猛跑小猪

他们是一样的。请参阅选择器上的 Go 规范:对于xtypeT或*TwhereT不是指针或接口类型的值,x.f表示最浅深度的字段或方法,T其中存在此类f。如果没有f最浅的深度,则选择器表达式是非法的。请注意,这意味着b.a如果 typeB在相同深度上嵌入具有相同字段的两种类型,则这是非法的:type A1 struct{ a string }type A2 struct{ a string }type B struct {    A1    A2}// ...b := B{A1{"a1"}, A2{"a2"}}fmt.Println(b.a) // Error: ambiguous selector b.a游乐场:http : //play.golang.org/p/PTqm-HzBDr。
随时随地看视频慕课网APP

相关分类

Go
我要回答