为什么在 Go 中没有推广这种方法?

下面的代码是如何工作的?我的理解是 obj1 嵌入了 obj2,因此提升了 printTest,这样我们就可以调用 obj1.printTest() 而不是需要使用 obj1.obj2.printTest() 来调用它。


obj1Selector 会发生什么(我不确定 obj2 前面的字符串叫什么)?obj1Selector 是否嵌入了 obj2?有人告诉我 obj1Selector 没有嵌入 obj2 而是实现了一个名为 selector 的字段,它的类型为 obj2,但这意味着什么 - 为什么不嵌入?为什么我不能调用 oSelector.printTest()?


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()


    oSelector := obj1Selector{}

    oSelector.selector.printTest()

    //oSelector.printTest() //Doesn't work


慕神8447489
浏览 136回答 1
1回答

郎朗坤

它被称为embedding。从 Golang 规范:Go 没有提供典型的、类型驱动的子类化概念,但它确实有能力通过在结构或接口中嵌入类型来“借用”实现的片段。在的情况下obj1,它是embeddingtype obj2,这意味着,obj2可以做什么,obj1可以做什么。所以你可以printTest直接调用obj1.而在 的情况下obj1Selector,它定义了一个名为的新字段selector,该字段具有类型obj2,因此您必须printTest在 the上调用selector,而不是在 on 上调用obj1Selector。您不能直接在 上调用它obj1Selector,因为此方法属于该结构中的另一个字段,即selector。它类似于在 java 中的方式,我们可以有一个具有另一个类类型的类字段,因此如果您想调用在该字段上定义的函数,它将是{InstanceOfThatClass}.{fieldName}.{method}.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go