下面的代码是如何工作的?我的理解是 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
,它是embedding
type obj2
,这意味着,obj2
可以做什么,obj1
可以做什么。所以你可以printTest
直接调用obj1
.
而在 的情况下obj1Selector
,它定义了一个名为的新字段selector
,该字段具有类型obj2
,因此您必须printTest
在 the上调用selector
,而不是在 on 上调用obj1Selector
。
您不能直接在 上调用它obj1Selector
,因为此方法属于该结构中的另一个字段,即selector
。
它类似于在 java 中的方式,我们可以有一个具有另一个类类型的类字段,因此如果您想调用在该字段上定义的函数,它将是{InstanceOfThatClass}.{fieldName}.{method}
.
- 1 回答
- 0 关注
- 135 浏览
添加回答
举报
0/150
提交
取消