2015-10-22 85 views
2

我想了解去嵌套的結構,所以我做了一個小測試:(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\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 
} 

因此,如何以及爲什麼最後兩行工作?他們是一樣的嗎?我應該使用哪個?

回答

5

它們是相同的。見the Go Spec on selectors

對於T型或*T的值x其中T不是指針或接口類型,x.f表示在T最淺深度的字段或方法,其中,有這樣一個f。如果深度不是最淺的一個f,則選擇器表達式是非法的。

注意,這意味着b.a是非法的,如果類型B嵌入在同一深度兩類具有相同的字段:

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