golang的继承
golang是可以实现继承的,但是这种继承并不是严格意义上的继承,golang并不支持继承特性,因而也没有单继承,多继承,重写方法等复杂概念。
下面通过一些例子来讲解golang的继承
组合继承
(1)匿名继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | type People struct {} func (p *People) ShowA() { fmt.Println( "showA" ) p.ShowB() } func (p *People) ShowB() { fmt.Println( "showB" ) } type Teacher struct { People } func (t *Teacher) ShowB() { fmt.Println( "teacher showB" ) } func main() { t := Teacher{} t.ShowA() //showA\nshowB t.People.ShowA() //showA\nshowB t.ShowB() //teacher showB t.People.ShowB() //showB } |
解释输出结果:
t.ShowA() 输出:showA\nshowB。 调用showA时,因为Teacher没有ShowA()的方法,此时又匿名继承了People,所以会调到People实现的ShowA方法去
t.People.ShowA() 输出:showA\nshowB。 匿名继承时指定调用的结构体方法,这时候一定会调用People上的ShowA方法,如果People没有该方法会编译报错
t.ShowB() 输出:eacher showB。 因为Teacher本身有实现ShowB方法,所以会调用到 Teacher的ShowB方法。
t.People.ShowB() 输出:showB。 此时如果我们想调用People的ShowB方法只能时通过指定结构体的方法。
(2)有名继承
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | type People struct {} func (p *People) ShowA() { fmt.Println( "showA" ) p.ShowB() } func (p *People) ShowB() { fmt.Println( "showB" ) } type Teacher struct { P People } func (t *Teacher) ShowB() { fmt.Println( "teacher showB" ) } func main() { t := Teacher{} t.ShowA() //报错 t.People.ShowA() //报错 t.People.ShowB() //报错 t.ShowA() // 报错 t.ShowB() //teacher showB t.P.ShowA() //showA\nshowB t.P.ShowB() //showB } |
输出结果解释:
t.ShowA() 结果:报错。 Teacher没有ShowA的方法,虽然People有,但是此时People不是匿名继承 ,如果要要调用需要指定继承事指定的名称。
t.People.ShowA() 结果:报错。 t里没有这个对象,此时People在结构体的名称为P,而不是People,此时的People是P的类型
t.People.ShowB() 结果:报错。 同时上
t.ShowB() 结果:teacher showB。 调用teacher的ShowB方法
t.P.ShowA() 结果:showA\nshowB 。有名继承,People是P的类型,此时调用People的ShowA方法
t.P.ShowB() //showB 同上
未完待续。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架