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

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

package mainimport "fmt"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)结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的字段和方法),在访问时,就必须明确指定匿名结构体名字,否则编译报错。

package mainimport "fmt"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)嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/119765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软件测试】了解JUnit单元测试框架常用注解

目录 1、认识JUnit 2、Junit中常见的注解 1、Test 2、Disabled 3、BeforeAll和AfterAll 4、BeforeEach和AfterEach 5、 ParameterizedTest:参数化 6、order 3、断言 1、断言相等【Assertions.assertEquals(预期,比较值)】;相等测试通…

使用docker部署lnmp多站点

1. 创建一个 Docker 网络 以便容器可以在同一网络上进行通信 docker network create lnmpnetwork2. 运行 MySQL 容器: 运行 MySQL 容器并将其连接到创建的网络。确保将 MySQL 的端口映射到宿主机上,以便您可以从宿主机访问数据库。 将mysql的配置和数…

Spring-手写模拟Spring底层原理

概述 模拟大致的底层原理,为学习Spring源码做铺垫。 实现的功能:扫描路径、依赖注入、aware回调、初始化前、初始化、初始化后、切面 未实现的功能:构造器推断、循环依赖 重点:BeanDefinition、BeanPostProcessor 学习Spring…

SpringBoot日志+SpringMVC+UUID重命名文件+Idea热部署

目录 【SpringBoot日志】 什么是日志,日志的作用 关于日志的基本信息,又有哪些呢? 关于日志的级别 Springboot内置SLF4J【门面模式】 和 logback【日志框架】 在配置文件中可以设置日志级别【以.yml为例】 SpringBoot 持久化的保存日…

【ARM Coresight 系列文章19.2 -- Cortex-A720 AMU 详细介绍】

文章目录 1.1 PMU 与 AMU1.2 AMU 介绍1.2.1 AMU 编程模型1.2.2 AMU 的访问1.2.3 Activity monitors counters1.1 PMU 与 AMU A-Prolifile 构架中的 Performance Monitoring Unit(PMU)和Activity Monitoring Unit(AMU)都具有性能计数器。AMU和PMU可以计数的事件类似,那么AMU…

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理

紫光集团、展讯通信、锐迪科(RDA)、紫光展锐以及翱捷科技(ASR)关系梳理 参考链接: 一文梳理国产芯片巨头:紫光集团https://zhuanlan.zhihu.com/p/578232102 紫光展锐发展史,曾经的热血海归们如今都去哪了? 然而早在2013年和2014年,展讯和锐迪科就分别被紫光收购。相隔一…

客户端负载均衡策略:loadBalancer,ribbon

客户端负载均衡是指在分布式系统中,客户端通过某种策略将请求分发到多个服务提供者实例上,以达到负载均衡和提高系统的可用性和性能。 在 Java 生态系统中,Ribbon 是一个常用的客户端负载均衡框架,它是 Netflix 开源的一部分&…

Echarts 实现 设备运行状态图(甘特图) 工业大数据展示

let option{tooltip: {formatter: function (params) {let startTime new Date(params.value[1])let endTime new Date(params.value[2]);//北京时间/时间戳转成日常时间function convert(date){var y date.getFullYear();var m date.getMonth() 1;m m < 10 ? "0…

DBOW概要理解与记录

前言 DBOW作为一种视觉回环技术被广泛应用在各类VSLAM框架中&#xff0c;之前的经验主要集中在使用和抽象理解层面&#xff0c;近期花了一些时间仔细阅读了相关论文和源码&#xff0c;这里做一些记录。 两个关键概念 Vocabulary 通过预先训练得到的词汇库&#xff0c;以树状…

rust OJ实战

目录 力扣 414. 第三大的数 力扣 628. 三个数的最大乘积 力扣 414. 第三大的数 给你一个非空数组&#xff0c;返回此数组中 第三大的数 。如果不存在&#xff0c;则返回数组中最大的数。 示例 1&#xff1a; 输入&#xff1a;[3, 2, 1] 输出&#xff1a;1 解释&#xff1a;…

LeetCode217——存在重复元素

LeetCode217——存在重复元素 1.题目描述&#xff1a; 给你一个整数数组 nums 。如果任一值在数组中出现 至少两次 &#xff0c;返回 true &#xff1b;如果数组中每个元素互不相同&#xff0c;返回 false 。 2.Result01(暴力解) public static boolean containsDuplicate(in…

在Go项目中封装AES加解密客户端接口

1.摘要 在一个中型以上的项目中, 我们一般会在项目工程中开辟一个pkg文件夹用来存放一些基础工具接口,比如:数据库、中间件、加解密算法、基础协议等等。在这篇文章中, 我主要分享一下在基于Go语言的项目中, 加解密算法中如何封装一个通用的加解密接口, 并以使用比较广泛的AES…

机器学习2(Numpy)

1、numpy ndarray 案例演示 可以在创建的时候就指定元素类型 生成0/1数组 从现有数组中生成 生成固定数组 生成随机数组

如何将 huggingface上的模型文件下载到本地

写在前面 缘由&#xff1a;国内的GPU服务器直接调取 huggingface 上模型经常会失败&#xff0c;因此下载到本地就能免去许多麻烦。 方法三基于知乎上一位博主所提出方法的基础上进行改进&#xff0c;可以将huggingface上模型由 Colab 存进 谷歌云盘 或者 百度云盘。特别是有些…

ThinkPHP6 多应用模式之验证码模块的配置与验证

Thinphp6 官方的验证码模块的配置是有问题的&#xff0c;或者说需要手工配置。 在配置期间&#xff0c;我尝试了多种&#xff08;包括按照官方文档、路由等&#xff09;方法都验证失败。 存在2个问题&#xff1a; 1、多应用模式下&#xff0c;验证码的配置文件依然读取全局的…

项目管理之如何有效定义项目目标

项目目标管理是项目管理中非常重要的一个环节&#xff0c;它可以帮助项目团队明确目标&#xff0c;制定合理可行的计划&#xff0c;确保项目顺利实施并取得成功。在定义项目目标时&#xff0c;需要遵循SMART原则&#xff0c;确保目标具体、明确、可衡量、可实现、相关且有时间和…

基于ssm的宠物医院管理系统的设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

简单8位CPU设计verilog微处理器,源码/视频

名称&#xff1a;8位CPU设计微处理器 软件&#xff1a;QuartusII 语言&#xff1a;Verilog 代码功能&#xff1a; 设计一个简单的处理器&#xff0c;可以实现加减法以及简单的逻辑运算。 设计包括程序计数器电路&#xff0c;指令存储器电路&#xff0c;指令译码器电路(控制器…

Java Boolean类,Java Character类,Java Number类

Boolean 类将基本类型为 boolean 的值包装在一个对象中。一个 Boolean 类的对象只包含一个类型为 boolean 的字段。此外&#xff0c;此类还为 boolean 和 String 的相互转换提供了很多方法&#xff0c;并提供了处理 boolean 时非常有用的其他一些常用方法。 Boolean 类的构造方…

nginx浏览器缓存和上流缓存expires指令_nginx配置HTTPS

1.nginx控制浏览器缓存是针对于静态资源[js,css,图片等] 1.1 expires指令 location /static {alias/home/imooc;#设置浏览器缓存10s过期expires 10s;#设置浏览器缓存时间晚上22:30分过期expires @22h30m;#设置浏览器缓存1小时候过期expires -1h;#设置浏览器不缓存expires …