为什么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
德赛Parth:

叫做embedding

根据Golang规范:

Go没有提供典型的类型驱动的子类化概念,但是它确实具有通过将类型嵌入结构或接口中来“借用”实现的各个部分的能力。

如果是obj1,则为embeddingtype obj2,这意味着obj2可以做obj1什么。因此,您可以printTest直接在上调用obj1

在这种情况下obj1Selector,它定义了一个名为类型新字段,因此您必须而不是上调用selectorobj2printTestselectorobj1Selector

您不能直接在上调用它obj1Selector,因为此方法属于该结构中的另一个字段,即selector

类似于java中的方法,我们可以拥有一个具有另一个类类型的class字段,因此,如果要调用在该字段上定义的函数,它将为{InstanceOfThatClass}.{fieldName}.{method}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在没有静态的情况下这种方法不起作用?

不明白为什么这种方法没有解决

当QDataStream没有这种方法时,为什么可以将QVariant写入QDataStream?

为什么不等待这种方法?

为什么在Firefox,Chrome和IE中,这种方法的工作方式有所不同?

为什么在stderr中没有这种水银错误?

有没有一种方法可以推广Apache ANT目标?

为什么 repaint() 在这种方法中不能正常工作

为什么不推荐使用这种方法在chai中检查lengthOf()数组?

为什么我不能覆盖蟒蛇这种方法吗?

为什么这种方法不同步?

为什么这种方法会陷入无限循环?

为什么这种方法和由谁来称呼

用这种方法覆盖equals()有什么弊端?

为什么有我的@FunctionalInterface有两种方法没有编译错误?

在ZIO中,有没有一种方法可以将IO [Nothing,T]转换为T,如果没有,为什么呢?

为什么这种解决“女王”困境的方法比Haskell中的另一种方法慢得多?

是什么使这种方法比这种方法更好?

为什么toTitle在Go中没有大写小写单词?

为什么Go中没有泛型?

在Java中,这种方法重载是什么?

“没有提供数组访问的固定方法”-为什么在Kotlin中发生这种情况?

在这种情况下,为什么续集对象没有 setOwner 方法?

为什么以这种方式编写getRGB()方法?有没有另一种写getRGB()方法的方法?

为什么在Go中有两种声明变量的方法,有什么区别以及使用哪种方法?

有没有一种方法可以在Go中快速订购类型?

有没有一种方法可以在Go中重载功能?

为什么JavaScript没有最后一种方法?

rxjava订阅的一种方法挂起,一种没有,为什么?