在字段中搜索结构的目的是什么(golang)?

时间:2016-04-12 18:40:09

标签: go

基于下面的示例,似乎是"在一个字段中嵌入一个结构"是打破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

1 个答案:

答案 0 :(得分:1)

你没有别名任何东西,选择器引用了一个可以使用点表示法在类型上引用的东西。您正在使用一种名为嵌入的概念,obj1嵌入obj2obj1Selector有一个名为selector的{​​{1}}字段。别名看起来像这样; obj2声明type obj3 obj2obj3的别名。

它打破了Go的推广机制?对不起,但你对这是如何工作的整个想法是基于。 obj2未嵌入obj1Selector类型,因此obj2'促销',obj2嵌入obj1没有字段/方法,因此有字段/方法“促进”。 obj2没有实现该接口,obj1Selector会这样做。

我为什么要嵌入?好吧,它有点等同于继承,或者至少在Go中开发时提供类似的功能集。也许我在数据存储中有许多记录,它们共享10个公共字段,然后有另外10个字段,这些字段取决于它们来自哪个表。就像我使用继承来减少典型的OO语言(如C ++,C#或Java)中的重复一样,我会在Go中使用嵌入。在我看来,这是它的主要用例。这是一种奇怪的组合和继承组合。你正在构建其他对象(你正在嵌入的对象)但是由于嵌入式类型方法/字段被提升到嵌入器范围,它的功能很像嵌入式继承自嵌入式类型。希望能给出一些关于你在这里处理什么的澄清......你并没有真正提出一个可以回答的问题,但是在评论中没有空间来对你的特征/概念进行如此冗长的解释。重新使用您的示例代码。