在字段(golang)中嵌入结构的目的是什么?

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


叮当猫咪
浏览 114回答 1
1回答

慕无忌1623718

你没有别名任何东西,选择器是指可以使用点表示法在类型上引用的一组事物。您正在使用一个名为 embedding、obj1embeds的概念obj2。obj1Selector有一个名为selectortype 的字段obj2。别名看起来像这样;type obj3 obj2它声明obj3为obj2.它打破了 Go 的提升机制?抱歉,您对如何工作的整个想法是断章取意的。obj1Selector不嵌入类型obj2,因此没有来自obj2'promoted'的字段/方法,obj1embeds obj2,因此它的字段/方法'promoted'。obj1Selector没有实现那个接口,obj1Selector.selector确实如此。我为什么要嵌入?嗯,它有点等同于继承,或者至少在 Go 中开发时提供了类似的功能集。也许我在数据存储中有许多记录,它们都共享 10 个公共字段,然后还有另外 10 个字段,这些字段取决于它们来自哪个表。正如我会在典型的面向对象语言(如 C++、C# 或 Java)中使用继承来减少重复一样,我会在 Go 中使用嵌入。在我看来,这是它的主要用例。这是一种组合和继承的奇怪组合。您正在编写其他对象(您嵌入的对象)的对象,但由于嵌入类型的方法/字段被提升到嵌入器范围,因此它的功能很像嵌入器从嵌入类型继承的。希望对您在这里处理的事情有所澄清......你没有'
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go