为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕神8447489 2022-01-04 15:44:49
下面的代码是如何工作的?我的理解是 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
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

它被称为embedding

从 Golang 规范:

Go 没有提供典型的、类型驱动的子类化概念,但它确实有能力通过在结构或接口中嵌入类型来“借用”实现的片段。

在的情况下obj1,它是embeddingtype obj2,这意味着,obj2可以做什么,obj1可以做什么。所以你可以printTest直接调用obj1.

而在 的情况下obj1Selector,它定义了一个名为的新字段selector,该字段具有类型obj2,因此您必须printTest在 the上调用selector,而不是在 on 上调用obj1Selector

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

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


查看完整回答
反对 回复 2022-01-04
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信