基于下面的示例,似乎是"在一个字段中嵌入一个结构"是打破Go"促销"机制。你为什么想做这个?
type obj1 struct {
obj2
}
type obj1Selector struct {
selector obj2
}
type obj2 struct {
}
func (o obj2) printTest() {
fmt.Println("obj2")
}
func main() {
o := obj1{}
o.printTest() //fine
oSelector := obj1Selector{}
oSelector.selector.printTest() //fine
oSelector.printTest() //not fine
答案 0 :(得分:1)
你没有别名任何东西,选择器引用了一个可以使用点表示法在类型上引用的东西。您正在使用一种名为嵌入的概念,obj1
嵌入obj2
。 obj1Selector
有一个名为selector
的{{1}}字段。别名看起来像这样; obj2
声明type obj3 obj2
为obj3
的别名。
它打破了Go的推广机制?对不起,但你对这是如何工作的整个想法是基于。 obj2
未嵌入obj1Selector
类型,因此obj2
'促销',obj2
嵌入obj1
没有字段/方法,因此有字段/方法“促进”。 obj2
没有实现该接口,obj1Selector
会这样做。
我为什么要嵌入?好吧,它有点等同于继承,或者至少在Go中开发时提供类似的功能集。也许我在数据存储中有许多记录,它们共享10个公共字段,然后有另外10个字段,这些字段取决于它们来自哪个表。就像我使用继承来减少典型的OO语言(如C ++,C#或Java)中的重复一样,我会在Go中使用嵌入。在我看来,这是它的主要用例。这是一种奇怪的组合和继承组合。你正在构建其他对象(你正在嵌入的对象)但是由于嵌入式类型方法/字段被提升到嵌入器范围,它的功能很像嵌入式继承自嵌入式类型。希望能给出一些关于你在这里处理什么的澄清......你并没有真正提出一个可以回答的问题,但是在评论中没有空间来对你的特征/概念进行如此冗长的解释。重新使用您的示例代码。