douyan1453 2015-10-22 14:00
浏览 9
已采纳

了解go嵌套结构

I'm trying to understand nested structs in go, so I made a little test: (playground)

type A struct {
    a string
}

type B struct {
    A
    b string
}

func main() {
    b := B{A{"a val"}, "b val"}

    fmt.Printf("%T -> %v
", 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
}

So how and why the last two lines work? Are they are same? Which should I use?

  • 写回答

1条回答 默认 最新

  • dongshi9407 2015-10-22 14:04
    关注

    They are the same. See the Go Spec on selectors:

    For a value x of type T or *T where T is not a pointer or interface type, x.f denotes the field or method at the shallowest depth in T where there is such an f. If there is not exactly one f with shallowest depth, the selector expression is illegal.

    Note that this means that b.a is illegal if type B embeds two types with the same field on the same depth:

    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
    

    Playground: http://play.golang.org/p/PTqm-HzBDr.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口