go的结构体嵌套(组合式继承)

本文解析了Golang中如何处理结构体嵌套,特别是关于`Teacher`类型如何继承`People`的`ShowB`方法,并揭示了编译器为支持接口而生成包装方法的原理。重点讲解了值接收者和指针接收者方法的区别,以及为什么`*Teacher`是调用嵌套方法的关键。
摘要由CSDN通过智能技术生成

下面这段代码输出什么?

在这里插入图片描述

答案解析:

参考答案及解析:teacher showB。

知识点:结构体嵌套。在嵌套结构体中,People 称为内部类型,Teacher 称为外部类型;通过嵌套,内部类型的属性、方法,可以为外部类型所有,就好像是外部类型自己的一样。此外,外部类型还可以定义自己的属性和方法,甚至可以定义与内部相同的方法,这样内部类型的方法就会被“屏蔽”。这个例子中的 ShowB() 就是同名方法。

加餐:

不要在golang里面谈父类子类和继承。类比都不要类比。纯属误导人!!!

golang没有类与继承。有接口,内嵌,组合。

与面向对象的类对应的概念。不是struct,是interface!!

那些觉得struct对应类的。我问你,是不是觉得只有struct才能有方法?

事实上golang里面任何类型都可以有方法。接收器的类型远不止是struct。甚至连int都可以是接收器。

为什么不是 t:= new(Teacher{}) ,方法参数不是 *么

func (t *Teacher) ShowB()

t称之为方法ShowB的接收者,不是参数

代码设计时,通常将带星( * )表示修改接收者的成员变量数据用
在这里插入图片描述
在这里插入图片描述
所以编译器为*Teacher生成了这样的一个包装方法
在这里插入图片描述
现在,面对这4种类型的方法集列表
我们可以确定t.ShowA()会在语法糖的作用下,转换为对(*Teacher).ShowA()方法的调用,而它又会取出People成员的地址,作为接收者,去执行※(星号)People这里的ShowA方法,所以会有这样的输出
在这里插入图片描述

明明是Teacher中内嵌了people,为什么编译器只给*Teacher生成包装方法?

为了支持接口,编译器会为值接收者方法生成指针接收者的包装方法,所以*A多了一个Value的包装方法。再除去已定义的方法,剩下的是编译器生成的包装方法,可以看到,编译器把逻辑合理的方法都生成出来了。只有B只继承了A的方法,没有继承※A的方法。这是因为:以B为接收者调用方法时,方法操作的已经是B的副本,无法获取嵌入的A的原始地址;而※A的方法从语义上来讲,需要操作原始变量,也就是说,对于B而言,它继承※A的方法是没有意义的,所以编译器并没有给B生成Set方法

在这里插入图片描述

在这里插入图片描述

结论:无论是嵌入值还是嵌入指针,值接收者方法始终能够被继承。而只有在能够拿到嵌入对象的地址时,才能继承指针接收者方法

这就是编译器为组合式继承生成包装方法的规则
在这里插入图片描述
部分解析转载自【卷卷面试题02:组合式继承】 https://www.bilibili.com/video/BV1ZP4y1H7Gk/?share_source=copy_web&vd_source=6b513d7c15a9ef4cda1b2673a4e18fb9

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值