(作爲後續這個問題:nested struct initialization literals)。嵌套結構 - 獲得「基」結構
既然我可以初始化一個易於編寫的文字的結構,我後來在我的代碼中需要訪問父結構的成員,但不知道具體的派生類型。它是這樣的:
type A struct {
MemberA string
}
type B struct {
A
MemberB string
}
然後我用這樣的:
b := B {
A: A { MemberA: "test1" },
MemberB: "test2",
}
fmt.Printf("%+v\n", b)
var i interface{} = b
// later in the code, I only know that I have something that has a nested A,
// I don't know about B (because A is in a library and B is in the
// calling code that uses the library).
// so I want to say "give me the A out of i", so I try a type assertion
if a, ok := i.(A); ok {
fmt.Printf("Yup, A is A: %+v\n", a)
} else {
fmt.Printf("Aristotle (and John Galt) be damned! A is NOT A\n")
}
// no go
選項我看到的是:
我可以使用反射來尋找一個名爲「成員一個「,並假設它是正確的類型,使用它。這將是可行的,但效率較低,肯定更「笨拙」。
我可能需要調用者實現接口(如
HasA { Aval() A }
或類似返回A的一個實例到目前爲止,這是最好的想法,我能想到的。另一點是,我可以只是讓調用者傳遞一個A值(即在上面的例子中,
var i interface{} = b
變成了var i A = b.A
)但是,發生的事情是我實際上動態地遍歷B的成員並且對它們做了一些事情,所以我需要更多的「派生」類型(我忽略了這個問題,因爲它更像是背景,爲什麼我會遇到這個問題,並且與問題的技術答案無關。)
如果我可以「將它投射到A」,那將是非常好的,就像在Java中一樣。有沒有更好的方法來做到這一點。
我明白了。由於A實現了AEmbedder,所以B,通過嵌套也可以實現......這看起來非常有效且簡單。這也意味着當你執行'var i AEmbedder = b'時,'i'中的值的運行時類型仍然是B - 所以迭代它的字段等,給我更多派生時間的結果。漂亮的拉德。我認爲這正是我想要的。 (除非我完全可以避免這一點,正如你所提到的。) –