(作为这个问题的后续:嵌套结构初始化文字)。
现在我可以使用易于编写的文字来初始化一个结构,我稍后在我的代码中需要访问父结构的成员,但不知道具体的派生类型。就像这样:
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
我看到的选项是:
我可以使用反射来查找名为“A”的成员,并假设它是正确的类型,使用它。这将是可行的,但效率较低,而且肯定更“笨拙”。
我可以要求调用者实现一个接口(类似
HasA { Aval() A }
或类似的接口,它返回一个 A 的实例。到目前为止,这是我能想到的最好的主意。另一点是我可以让调用者传递一个 A 值(即在上面的示例中,
var i interface{} = b
变为var i A = b.A
)。但是发生的事情是我实际上动态地迭代 B 的成员并用它们做一些事情,所以我需要更多的“派生”类型才能做到这一点。(我从问题中省略了这一点,因为这只是关于我为什么遇到这个问题的背景,并且与问题的技术答案无关。)
如果我可以像在 Java 中那样“将其转换为 A”,那就太好了。有没有更优雅的方法来做到这一点。