你濫用嵌入。事情是,你已經在Manager1
上定義了Context
,儘管你已經在每個後續類型上重新定義了它。在Manager3
中,您正在設置它的值爲Context
實例。當調用Hello()
時,它在Manager2
上定義並訪問它的Context
實例,該實例沒有值。看看這個例子來證明http://play.golang.org/p/XebShA9ap4
錢就行是: m3 = Manager3{Manager2: Manager2{Context: Context{Value: "testing3"}}}
正如你可以看到,如果我實例化嵌入Manager3
的Manager2
實例,並設置它的Context
值它被打印出來。我會建議改變你的類型,以便Context
僅在Manager1
上定義,然後在初始化類型時使用類似於我的示例中的語法。
編輯:爲了把寫在評論中討論的設計,你會改變你的類型到這個;
type Context struct {
Value string
}
type Manager1 struct {
Context Context
}
type Manager2 struct {
Manager1
}
type Manager3 struct {
Manager2
}
刪除的Hello()
實施上Manager2
乾脆。然後更新你的複合文字初始化到這個;
m1 := Manager1{Context: Context{Value: "testing1"}}
m2 := Manager2{Manager1: Manager1{Context: Context{Value: "testing2"}}}
m3 := Manager3{Manager2: Manager2{Manager1: Manager1{Context: Context{Value: "testing3"}}}}
我甚至可以說Manager2和Manager3根本不應該包含上下文:https://play.golang.org/p/YkxjPZ4Hm6。除非他們需要沒有獨特的價值。但是他們都需要實現這個功能。 – captncraig
@ captncraig是的我以爲我在倒數第二段中提到了這一點。也許它不清楚。但是,是的,如果'Manager1'有一個'Context'實例,將相同的字段放入任何嵌入'Manager1'的東西是一個糟糕的設計。除了冗餘之外,這是該死的混亂! – evanmcdonnal