Go 面向对象(匿名字段)

news2025/1/21 18:54:03

概述

严格意义上说,GO语言中没有类(class)的概念,但是我们可以将结构体比作为类,因为在结构体中可以添加属性(成员),方法(函数)。

面向对象编程的好处比较多,我们先来说一下“继承”,

所谓继承指的是,我们可能会在一些类(结构体)中,写一些重复的成员,我们可以将这些重复的成员,单独的封装到一个类(结构体)中,作为这些类的父类(结构体),我们可以通过如下图来理解:
在这里插入图片描述
当然严格意义上,GO语言中是没有继承的,但是我们可以通过”匿名组合”来实现继承的效果。

一、 匿名字段

一般情况下,定义结构体的时候是字段名与其类型一一对应,实际上Go支持只提供类型,而不写字段名的方式,也就是匿名字段,也称为嵌入字段。

当匿名字段也是一个结构体的时候,那么这个结构体所拥有的全部字段都被隐式地引入了当前定义的这个结构体。

//人
type Person struct {
  name string
  sex byte
  age int
}

//学生
type Student struct {
  Person //匿名字段,那么默认Student就包含了Person的所有字段
  id int
  addr string
}

Person也就是上面定义的这个Person结构体。

二、 初始化

//人
type Person struct {
  name string
  sex byte
  age int
}

//学生
type Student struct {
  Person//匿名字段,那么默认Student就包含了Person的所有字段
  id int
  addr string
}

func main() {
  //顺序初始化
  s1 := Student{Person{"mike",'m',18},1,"sz"}
  //s1 = {Person:{name:mike sex:109 age:18}id:1 addr:sz}
  fmt.Printf("s1=%+v\n",s1)
  //s2 := Student{"mike",'m',18,1,"sz"}//err
  //部分成员初始化1
  s3 := Student{Person:Person{"lily",'f',19},id:2}
  //s3 = {Person:{name:lily sex:102 age:19}id:2 addr:}
  fmt.Printf("s3=%+v\n",s3)
  //部分成员初始化2
  s4 := Student{Person:Person{name:"tom"},id:3}
  //s4 = {Person:{name:tomsex:0age:0}id:3addr:}
  fmt.Printf("s4=%+v\n",s4)
}

然后我们在main里面调用Student就能直接对Person里面的属性赋值。

三、 成员的操作

var s1 Student//变量声明
//给成员赋值
s1.name = "mike"//等价于s1.Person.name="mike"
s1.sex = 'm'
s1.age = 18
s1.id = 1
s1.addr = "sz"
fmt.Println(s1) //{{mike 109 18}1 sz}
var s2 Student//变量声明
s2.Person = Person{"lily",'f',19}
s2.id = 2
s2.addr = "bj"
fmt.Println(s2) //{{lily 102 19}2 bj}

或者我们声明一个Student的变量也能调用它里面的属性。

四、 同名字段

//人
type Person struct{
  name string
  sex byte
  age int
}

//学生
type Student struct{
  Person //匿名字段,那么默认Student就包含了Person的所有字段
  id int
  addr string
  name string //和Person中的name同名
}

func main(){
  var s Student//变量声明
  //给Student的name,还是给Person赋值?
  s.name = "mike"
  //{Person:{name:sex:0age:0}id:0addr:name:mike}
  fmt.Printf("%+v\n",s)
  //默认只会给最外层的成员赋值
  //给匿名同名成员赋值,需要显示调用
  s.Person.name = "yoyo"
  //Person:{name:yoyosex:0age:0}id:0addr:name:mike}
  fmt.Printf("%+v\n",s)
}

如果命名重名的话我们调用只会给最外层的使用,也就是Student,如果说你要给Person赋值的话得明确表示。s.Person.name=“张三”。

五、 其它匿名字段

1. 非结构体类型
所有的内置类型和自定义类型都是可以作为匿名字段的:

type mystr string//自定义类型
type Person struct {
  name string
  sex byte
  age int
}
type Student struct {
  Person //匿名字段,结构体类型
  int //匿名字段,内置类型
  mystr //匿名字段,自定义类型
}
func main() {
  //初始化
  s1 := Student{Person{"mike",'m',18},1,"bj"}
  //{Person:{name:mikesex:109age:18}int:1mystr:bj}
  fmt.Printf("%+v\n",s1)
  //成员的操作,打印结果:mike,m,18,1,bj
  fmt.Printf("%s,%c,%d,%d,%s\n",s1.name,s1.sex,s1.age,s1.int,s1.mystr)
}

不一样要结构体才能作为匿名字段,其实定义一个类型也是一样的。

2. 结构体指针类型

type Person struct { //人
  name string
  sex byte
  age int
}
type Student struct {//学生
  *Person //匿名字段,结构体指针类型
  id int
  addr string
}
func main() {
  //初始化
  s1 := Student{&Person{"mike",'m',18},1,"bj"}
  //{Person:0xc0420023e0id:1addr:bj}
  fmt.Printf("%+v\n",s1)
  //mike,m,18
  fmt.Printf("%s,%c,%d\n",s1.name,s1.sex,s1.age)
  //声明变量
  var s2 Student
  s2.Person = new(Person)//分配空间
  s2.name = "yoyo"
  s2.sex = 'f'
  s2.age = 20
  s2.id = 2
  s2.addr = "sz"
  //yoyo10220220
  fmt.Println(s2.name,s2.sex,s2.age,s2.id,s2.age)
}

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

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

相关文章

软件系统测试报告包括哪些内容?对软件产品起到什么作用?

软件系统测试报告是软件开发过程中非常重要的一环。它是一个详细记录了对系统进行测试的结果和总结的文档。通过系统测试报告,开发人员可以了解系统在测试过程中的表现,发现系统的问题和不足之处,从而采取相应的措施进行改进。 一、软件系统…

睿趣科技:抖音开小店大概多久可以做起来

随着移动互联网的快速发展,社交媒体平台成为了人们分享生活、交流信息的主要渠道之一。在众多社交平台中,抖音以其独特的短视频形式和强大的用户粘性受到了广泛关注。近年来,越来越多的人通过在抖音上开设小店来实现创业梦想,这种…

CSPM考试如何报名?证书在哪查?

WOW!咱们国家自己的项目管理证书来了!! 下面我将从7个方面对国标项目管理证书CSPM详细介绍: (1)CSPM是什么证书? (2)和PMP什么关系? (3&#…

Windows系统下MMDeploy预编译包的使用

Windows系统下MMDeploy预编译包的使用 MMDeploy步入v1版本后安装/使用难度大幅下降,这里以部署MMDetection项目的Faster R-CNN模型为例,将PyTorch模型转换为ONNX进而转换为Engine模型,部署到TensorRT后端,实现高效推理&#xff0c…

SQL注入漏洞复现(CVE-2017-8917)

文章目录 搭建环境启动环境漏洞复现报错注入使用sqlmap 前提条件: 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub Docker Compose是 docker 提供的一个命令行工具&…

PKI/CA体系介绍

概述 目前最常用的第三方认证服务包括:PKI/CA和Kerberos。PKI/CA是基于非对称密钥体系的,Kerberos是基于对称密钥体系的。 数字证书:提供一种发布公钥的简便途径; 数字签名:用来确认信息发送者的身份,保证…

【Go 基础篇】走进Go语言的面向对象编程世界

欢迎各位编程爱好者们!今天我们将进入Go语言的面向对象编程(OOP)世界,一窥这门语言如何运用OOP思想来组织和构建程序。无论你是初学者还是有一些经验的开发者,本文都将为你揭示Go语言中的OOP特性、方法和最佳实践。 O…

2023年高教社杯数学建模思路 - 案例:最短时间生产计划安排

文章目录 0 赛题思路1 模型描述2 实例2.1 问题描述2.2 数学模型2.2.1 模型流程2.2.2 符号约定2.2.3 求解模型 2.3 相关代码2.4 模型求解结果 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 最短时…

对称加密 非对称加密 AC认证 https原理

文章目录 对称加密及漏洞非对称加密及漏洞什么是数据摘要(也称数据指纹)什么是CA认证CA证书签发过程https通信方案 对称加密及漏洞 对称加密是一种加密算法,使用相同的密钥(也称为对称密钥)用于加密和解密数据。在对称…

不可错过!一分钟揭秘主品牌的战略价值

主品牌是企业的心脏,主品牌的进化是企业回归增长的关键,而主品牌的老化、弱化或退化则意味着企业面临衰退的风险。主品牌在企业中扮演着核心角色,它代表着企业的价值观和形象,直接影响着市场地位和竞争力,能够充分理解…

【JS案例】JS实现图片放大镜功能

JS案例图片放大镜 🌟效果展示 🌟HTML结构 🌟CSS样式 🌟实现思路 🌟具体实现 1.初始化数据图片 2.获取所需DOM元素 3.初始化页面 初始化缩略图 绑定事件 🌟完整代码 🌟写在最后 &…

原子操作的原理和实现

目录 相关术语 处理器如何实现原子操作 Java如何实现原子操作 循环CAS实现原子操作 使用锁机制实现原子操作 原子操作是指一个或者多个不可再分割的操作。这些操作的执行顺序不能被打乱。 相关术语 缓存行:缓存的最小操作单位 (面试题、重点&…

GP服务使用本地上传的文件进行分析

1、需求: 自己选择本地的文件上传在gp服务中进行分析,例如实现这个需求: 2、遇到的困境 发布创建TIN工具时要输入值表,但是我这里选择了本地的SHP文件和高程值后,发布出去就是一个常量值了,没法自己选择文…

App与小程序工具总结

文章目录 前言Burpsuite抓包问题LPosedJustTrustMe 绕过 SSL Pining小程序的反编译APP脱壳,反射大师、frida反射大师Frida 总结 前言 在进行渗透工作的时候,遇到过的App、小程序也不少了,有简单的,也有加固的比较不错的&#xff…

【软考】系统集成项目管理工程师(一)信息化基础知识【6分】

一、信息与信息系统 1、信息技术 为解决信息的采集、加工、存储、传输、处理、计算、转换、表现等问题而不断繁荣发展 核心-传输技术(通常指通信、网络等) 2、信息的质量属性 特点:客观性、普遍性 属性描述精确性对事物状态描述的精准程度…

接口幂等性设计的最佳实现

一、什么是幂等 二、为什么需要幂等 三、接口超时了,到底如何处理? 四、如何设计幂等 全局的唯一性ID 幂等设计的基本流程 五、实现幂等的8种方案 selectinsert主键/唯一索引冲突 直接insert 主键/唯一索引冲突 状态机幂等 抽取防重表 token令牌 悲观锁…

stm32之27.iic协议oled显示

屏幕如果无法点亮,需要用GPIO_OType_PP推挽输出,加并上拉电阻 1.显示字符串代码 2.显示图片代码(unsigned强制转换(char*)) 汉字显示

​iOS上架审核宝典:如何避免被拒一次提交成功

Xcode 摘要:本文整理了iOS上架需要注意的事项,以帮助从事iOS开发和App运营的朋友们避免审核被拒的困扰。通过遵循这些指南,我们可以在一次提交中成功地将应用上架,并节省宝贵的时间和精力。 引言: 从事iOS开发和App运…

【一等奖方案】大规模金融图数据中异常风险行为模式挖掘赛题「NUFE」解题思路

第十届CCF大数据与计算智能大赛(2022 CCF BDCI)已圆满结束,大赛官方竞赛平台DataFountain(简称DF平台)正在陆续释出各赛题获奖队伍的方案思路,欢迎广大数据科学家交流讨论。 本方案为【大规模金融图数据中…

AcWing 4405. 统计子矩阵(每日一题)

如果你觉得这篇题解对你有用,可以点点关注再走呗~ 题目描述 给定一个 NM 的矩阵 A,请你统计有多少个子矩阵 (最小 11,最大 NM) 满足子矩阵中所有数的和不超过给定的整数 K ? 输入格式 第一行包含三个整数 N,M 和 K。 之后 N 行每行包含 …