38-Golang中的继承

news2025/7/13 11:10:57

继承基本介绍和示意图

1.继承可以解决代码复用,让我们编程更加靠近人类思维

2.当多个结构体存在相同的属性(字段)和方法时,可以从这些结构体中抽象出结构体,在该结构体中定义这些相同的属性和方法

3.其他的结构体不需要重新定义这些属性(字段)和方法,只需嵌套一个匿名结构体即可

在这里插入图片描述
4.也就是说:在golang中,如果一个struct嵌套了另一个匿名结构体,那么这个结构体可以直接访问匿名结构体的字段和方法,从而实现继承特性。

嵌套匿名结构体的基本语法

type Goods strust {

​	Name string

​	Price int

}

type Book struct{

​	Goods //这里就是嵌套匿名结构体Goods

​	Writer string

}
package main
import (
	"fmt"
)
//编写一个学生考试系统
type Student struct {
	Name string
	Age int
	Score int
}
//将pupil和graduate共有的方法绑定到*student
func (stu *Student) ShowInfo() {
	fmt.Printf("学生名=%v 年龄=%v 成绩=%v\n", stu.Name, stu.Age, stu.Score)
}
func (stu *Student) SetScore (score int) {
	stu.Score = score
}
//小学生
type Pupil struct {
	Student //嵌入student匿名结构体
}
//大学生
type Graduate struct {
	Student
}


//这时pupil结构体特有的方法,保留
func (p *Pupil) testing() {
	fmt.Println("小学生考试中")
}
func (p *Graduate) testing() {
	fmt.Println("大学生考试中")
}

func main() {
	//当我们对结构体嵌入了匿名结构体使用方法会发生变化
	pupil := &Pupil{}
	pupil.Student.Name = "tom"
	pupil.Student.Age = 8
	pupil.testing()
	pupil.Student.SetScore(90)
	pupil.Student.ShowInfo()

}

//小学生考试中
//学生名=tom 年龄=8 成绩=90


继承深入讨论

  • 1.结构体可以使用嵌套匿名结构体所有的字段和方法,即:首字母大写或者小写的字段、方法,都可以使用
  • 2.匿名结构体字段访问可以简化

在这里插入图片描述
- (1)当我们直接通过b访问字段或者方法时,其执行流程如下:b.Name
- (2)编译器会先看b对应的类型有没有Name,如果有,则直接调用B类型的Name子弹
- (3)如果没有就去看B中嵌入的匿名结构体A有没有声明Name字段,如果有就调用,如果没有继续查找,如果都找不到就报错

  • 3.当结构体和匿名结构体有相同的字段或者方法时,编译器选择采用就近访问原则访问,如希望访问匿名结构体的字段和方法,可以通过匿名结构体名来区分
    在这里插入图片描述
  • 4.结构体嵌入两个(或多个)匿名结构体,如两个匿名结构体有相同的字段和方法(同时结构体本身没有同名的子弹和方法),在访问时,就必须指定匿名结构体名字,否则编译报错
package main
import (
	"fmt"
)
type A struct {
	Name string
	age int
}
type B struct {
	Name string
	Score float64
}
type c struct {
	A
	B
// 	Name string
}
func main() {
	var c c
	//如果c,没有Name字段,而A和B有Name,
	//这是就必须指定匿名结构体名字来区分
	//所以cName就会被报编译错误,这个规则对方法也是一样的
	c.A.Name = "tom" //error
	fmt.Println("c")
}




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

在这里插入图片描述

  • 6.嵌套匿名结构体后,也可以在创建结构体变量(实例)时,直接指定各个匿名结构体字段的值。
    在这里插入图片描述

多重继承

  • 1.如果一个struct嵌套了多个匿名结构体,那么该结构体可以直接访问嵌套的匿名结构体的字段和方法,从而实现多重继承
  • 2.如嵌入的匿名结构体有相同的字段名或者方法名,则在访问时,需要通过匿名结构体类型名来区分
  • 3.为了保证代码的简洁性,尽量不使用多重继承

在这里插入图片描述

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

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

相关文章

TCP三次握手

参考:4.1 TCP 三次握手与四次挥手面试题 | 小林coding TCP 头格式 我们先来看看 TCP 头的格式,标注颜色的表示与本文关联比较大的字段,其他字段不做详细阐述。 序列号:在建立连接时由计算机生成的随机数作为其初始值&#xff0c…

一、HTTP协议01

文章目录一、用户在浏览器中输入网址背后发生的事二、什么是HTTP三、HTTP和TCP/IP的关系四、HTTP的特点4.1、客户/服务模式4.2、简单快速4.3、灵活4.4、无连接4.5、无状态五、HTTP报文结构分析-请求报文六、HTTP报文结构分析-响应报文七、HTTP请求方法八、状态码一、用户在浏览…

【Spark分布式内存计算框架——离线综合实战】7.应用执行调度

第四章 应用执行调度 前面已经完成【广告数据ETL】和【业务报表分析】,在IDEA中使用本地模式LocalMode开发,从本地文件系统LocalFS加载数据,接下来打包发到测试集群环境测试,并且使用Oozie调度执行。 4.1 应用打包 在集群环境…

CS224W课程学习笔记(四):node2vec算法原理与说明

引言 什么是图嵌入? 我想从上节的deepwalk中已经有一个十分完整的轮廓了,这里引出deepwalk论文中的一张很形象的图(当然,上节的一些实战演练,也将这种嵌入关系进行了模拟与可视化,前文为:&…

项目管理工具dhtmlxGantt甘特图入门教程(十三):导出PDF和PNG格式

这篇文章给大家讲解dhtmlxGantt如何导出PDF和PNG格式。 dhtmlxGantt是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表,可满足应用程序的所有需求,是完善的甘特图图表库 DhtmlxGantt正版试用下载(qun 764148812)https://www…

浅谈人工智能(`AI`)基础知识

人工智能(AI)-基础知识 1. 什么是人工智能 1.1 人工智能基础定义 人工智能(英语:artificial intelligence,缩写为AI)亦称智械、机器智能,指由人制造出来的机器所表现出来的智能。通常人工智能是指通过普通计算机程序…

【系统分析师之路】2022上案例分析历年真题

【系统分析师之路】2022上案例分析历年真题 【系统分析师之路】2022上案例分析历年真题【系统分析师之路】2022上案例分析历年真题2022上案例分析历年真题第一题(25分)2022上案例分析历年真题第二题(25分)2022上案例分析历年真题第…

3.4 Spring Boot 日志配置

第3章 Spring Boot 的系统配置 3.1 Spring Boot 系统配置文件 3.2 Spring Boot 自定义配置项 3.3 Spring Boot 其他配置 3.4 Spring Boot 日志配置 3.5 实战:Spring Boot 实现系统多环境配置 3.4 Spring Boot 日志配置 日志对于系统监控、故障定位非常重要&#xf…

Qt——Javascript/Qt交互、脚本化

Qt提供了对Javascript的良好支持, 如果查阅过文档你就知道Qt有两个不同的Js封装引擎: QScriptEngine QJSEngine QScriptEngine出现的比较早(自Qt4.3始),基于WebKit的JavaScriptCore引擎,提供的api相对来说比较丰富&a…

(一维、二维)数组传参,(一级、二级)指针传参【含样例分析,新手易懂】

目录数组传参一维数组传参二维数组传参指针传参一级指针传参二级指针传参我们在写代码的时候难免要把数组或者指针传给函数&#xff0c;那函数的参数该如何设计呢&#xff1f; 数组传参 一维数组传参 我们首先来看下面代码的几个例子&#xff1a; #include <stdio.h>…

优化长尾关键词有什么好处?在线长尾关键词挖掘

​想知道为什么要使用长尾关键词&#xff1f; 好吧&#xff0c;它们可以帮助你轻松找到合适的受众。 ​ 1.获得更高的转化率 长尾关键词对于搜索特定信息更有用。使用长尾关键词时通常会获得更高的转化率&#xff0c;因为内容与受众的需求更相关。 举个例子&#xff1a;你正…

3年测试拿8K,被校招来的实习生反超薪资,其实你在假装努力

最近朋友给我分享了一个他公司发生的事 大概的内容呢&#xff1a;公司一位工作3年的测试工资还没有新人高&#xff0c;对此怨气不小&#xff0c;她来公司辛辛苦苦三年&#xff0c;三年内迟到次数都不超过5次&#xff0c;每天都是按时上下班&#xff0c;工作也按量完成&#xf…

【华为OD机试模拟题】用 C++ 实现 - 最低位排序(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 货币单位换算(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 选座位(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 停车场最大距离(2023.Q1) 【华为OD机试模拟题】用 C++ 实现 - 重组字符串(2023.Q1) 【华为OD机试模…

结构效度分析流程

结构效度分析流程如下图 一、结构效度的意义 效度分析在学术研究中非常常见&#xff0c;结构效度是为了分析“从量表获得的结果与设计该量表时所假定的理论之间的符合程度”。简单来讲&#xff0c;在研究者设计量表之初&#xff0c;一般会预设好几个维度&#xff0c;在经过因子…

docker搭建MySQL集群(1主1从)

1.创建挂载路径及配置文件my.cnf&#xff0c;挂载mysql的数据、配置、日志 /usr/mydata/mysql/conf/s1 /usr/mydata/mysql/conf/m1my.cnf先只写server-id,保证主从不同 2.拉取MySQL镜像&#xff0c;启动两个实例 docker run -p 3316:3306 --name mysql-m1 -v /usr/mydata/m…

识别密文加密类型

离线密码破解&#xff1a;离线不会触发密码锁定机制不会产生大量登录失败日志引起管理员注意HASH识别工具&#xff08;识别哈希类型&#xff09;&#xff1a;hash-identifierHashid yara规则匹配文件得到特定加密算法一、hash-identifierKali Linux提供工具hash-identifier来识…

LabVIEW如何调用.m脚本LabVIEW调用MATLAB

LabVIEW如何调用.m脚本LabVIEW调用MATLAB有一个用MATLAB编写的脚本&#xff0c;想知道从LabVIEW调用它的方法&#xff0c;以及哪一个是最快的。解决方法有几种方法可以在LabVIEW中调用.m脚本。LabVIEW中的MATLABScript Node使用ActiveX调用MATLAB运行时系统。注意&#xff1a;不…

Nginx 02篇——Nginx基本配置与参数说明篇

Nginx 02篇——Nginx基本配置与参数说明篇前言-默认配置文件1. 前言——关于nginx1.1 关于nginx1. 2 Nginx 01篇——Nginx安装2. Nginx 配置文件结构2.1 Nginx 安装后的默认文件2.2 Nginx 的三大组成部分3. 配置参说明-1——整个配置3.1 配置说明3.2 参考4. 配置说明-2—详细说…

增量更新jar包的方法

由于现在绝大多数服务都采用spring boot,且在打包时一般选择全量包的形式,因此在服务依赖比较多的情况下,更新/添加其中的一个文件时,会造成很大的麻烦,比如一个服务打完包后,jar文件的体积可能在200M左右,因此在网络条件不好的情况下&#xff0c;频繁更新服务包还是比较麻烦的…

http/HTTPS相关的一些知识

2、http和https HTTP&#xff0c;超文本传输协议&#xff0c;规定了浏览器和服务器之间数据传输的规则。HTTP 是应用层协议&#xff0c;它以 TCP&#xff08;传输层&#xff09;作为底层协议&#xff0c;默认端口为 80。 http的通信过程&#xff1a;服务器在80端口等待客户的请…