以下代码如何工作?我的理解是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
叫做embedding
。
根据Golang规范:
Go没有提供典型的类型驱动的子类化概念,但是它确实具有通过将类型嵌入结构或接口中来“借用”实现的各个部分的能力。
如果是obj1
,则为embedding
type obj2
,这意味着obj2
可以做obj1
什么。因此,您可以printTest
直接在上调用obj1
。
在这种情况下obj1Selector
,它定义了一个名为类型的新字段,因此您必须在而不是上调用。selector
obj2
printTest
selector
obj1Selector
您不能直接在上调用它obj1Selector
,因为此方法属于该结构中的另一个字段,即selector
。
类似于java中的方法,我们可以拥有一个具有另一个类类型的class字段,因此,如果要调用在该字段上定义的函数,它将为{InstanceOfThatClass}.{fieldName}.{method}
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句