为了账号安全,请及时绑定邮箱和手机立即绑定

理解嵌套结构

理解嵌套结构

Go
沧海一幻觉 2021-11-15 20:47:13
我试图理解 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}那么最后两行是如何以及为什么起作用的呢?他们是一样的吗?我应该使用哪个?
查看完整描述

1 回答

?
猛跑小猪

TA贡献1858条经验 获得超8个赞

他们是一样的。请参阅选择器上的 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。


查看完整回答
反对 回复 2021-11-15
  • 1 回答
  • 0 关注
  • 176 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信