当前位置: 首页 > news >正文

Golang Struct 继承的深入讨论和细节

1)结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用。

type A struct {Name stringage  int
}func (a *A) SayName() {fmt.Println("A say name", a.Name)
}func (a *A) sayAge() {fmt.Println("A say age", a.age)
}type B struct {sex stringA
}func main() {b := &B{sex: "male",A: A{Name: "lucas",age:  29,},}b.SayName()b.A.sayAge()fmt.Println(b.Name)fmt.Println(b.age)
}

2)匿名结构体字段访问可以简化,如图

对上面的代码小结

(1)当我们直接通过b 访问字段或方法时,其执行流程如下,比如b.Name

(2)编译器会先看b对应的类型有没有Name,如果有,则直接调用B类型的Name字段

(3)如果没有就去看B中嵌入的匿名结构体A有没有声明Name字段,如果有就调用,如果没有继续查找..........如果都找不到就报错(如果A里面还有嵌入结构体那么就可以调用)

(4)当结构体和匿名结构体有相同的字段或者方法时,编译器采用就近访问原则访问,如希望访问匿名结构体的字段和方法可以通过匿名结构体名来区分

type A struct {Name stringage  int
}func (a *A) SayName() {fmt.Println("A say name", a.Name)
}func (a *A) sayAge() {fmt.Println("A say age", a.age)
}type B struct {sex  stringName stringA
}func (b *B) SayName() {fmt.Println("B say name", b.Name)
}func main() {b := &B{sex:  "male",Name: "jerry",A: A{Name: "lucas",age:  29,},}b.SayName()fmt.Println(b.Name)
}B say name jerry
jerry

可以看到B在找字段的时候已经找到了自身的字段Name,那么就不会去找A里面的Name字段。

(5)结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。

type A struct {Name stringage  int
}func (a *A) SayName() {fmt.Println("A say name", a.Name)
}type B struct {Name stringsex  string
}func (b *B) SayName() {fmt.Println("B say name", b.Name)
}type C struct {AB
}func main() {c := &C{A: A{Name: "lucas",age: 23,},B: B{Name: "jerry",sex: "male",},}c.A.SayName()fmt.Println(c.A.Name)
}

(6)如果一个struct嵌套了一个有名结构体,这种模式就是组合,如果是组合关系,那么在访问组合的结构体的字段或方法时,必须带上结构体的名字

(7)嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。

  

 

多重继承说明


如一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现了多重继承。

TV里面既可以使用Goods里面的属性和方法,同时也可以使用Brand里面的属性和方法。 

多重继承细节说明

1)如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分。

2)为了保证代码的简洁性,建议大家尽量不使用多重继承

相关文章:

  • ETCD备份与恢复
  • c# sqlite 修改字段类型
  • ssm164学院学生论坛的设计与实现+vue
  • GnuTLS recv error (-110): The TLS connection was non-properly terminated
  • leetCode 229. 多数元素 II + 摩尔投票法 + 进阶 + 优化空间
  • LeetCode刷题:27. 移除元素
  • uniapp把文件中的内复制到另一个文件中
  • RTCM数据解码
  • C# Winform编程(9)网络编程
  • 基于图像识别的自动驾驶汽车障碍物检测与避障算法研究
  • 如何批量给视频添加logo水印?
  • Cookie技术
  • 父子项目打包发布至私仓库
  • vue3 + Element-plus + Echarts 5.2 切换不更新、导出PDF不显示 解决方案
  • Linux系统下DHCP服务安装部署和使用实例详解(蜜罐)
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • php中curl和soap方式请求服务超时问题
  • Python语法速览与机器学习开发环境搭建
  • Redis字符串类型内部编码剖析
  • use Google search engine
  • 从零开始的无人驾驶 1
  • 技术攻略】php设计模式(一):简介及创建型模式
  • 解析带emoji和链接的聊天系统消息
  • 批量截取pdf文件
  • 前言-如何学习区块链
  • 如何学习JavaEE,项目又该如何做?
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • No resource identifier found for attribute,RxJava之zip操作符
  • (6)设计一个TimeMap
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (南京观海微电子)——COF介绍
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (转)平衡树
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET delegate 委托 、 Event 事件,接口回调
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .net 设置默认首页
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • .Net语言中的StringBuilder:入门到精通
  • .NET中GET与SET的用法
  • /3GB和/USERVA开关
  • /usr/bin/python: can't decompress data; zlib not available 的异常处理
  • @property @synthesize @dynamic 及相关属性作用探究
  • @ResponseBody
  • [ vulhub漏洞复现篇 ] ThinkPHP 5.0.23-Rce
  • [2009][note]构成理想导体超材料的有源THz欺骗表面等离子激元开关——
  • [AUTOSAR][诊断管理][ECU][$37] 请求退出传输。终止数据传输的(上传/下载)
  • [CareerCup] 17.8 Contiguous Sequence with Largest Sum 连续子序列之和最大
  • [CISCN 2019华东南]Web11
  • [CISCN2019 华东南赛区]Web4
  • [cocos2d-x]关于CC_CALLBACK