做的好微信商城网站/欧洲网站服务器
结构体
- 1. 自定义类型、类型别名
- 1.1. 自定义类型
- 1.2. 类型别名
- 1.3. 类型定义和类型别名的区别
- 2. 结构体定义
- 3. 结构体初始化
- 4. 指针类型结构体
- 5. 构造函数
- 6. 方法和接收者
- 6.1. 方法定义
- 6.2. 方法调用
- 6.3. 值方法和指针方法
- 6.4. 指针方法使用场景
- 6.5. 任意类型添加方法
- 7. 结构体成员可见性
- 8. 结构体匿名字段
- 9. 嵌套结构体
- 9.1. 嵌套匿名结构体
- 9.2. 嵌套结构体的字段名冲突
- 10. 通过嵌套实现“继承”
- 11. 结构体与JSON序列化
- 12. 结构体标签(Tag)
- 13. 匿名结构体
上一篇:字典及其约束
下一篇:通道
Go语言中没有“类”的概念,也不支持类的“继承”等面向对象的概念,它所做的是通过嵌入字段的方式实现了类型之间的组合。Go语言中通过结构体的内嵌再配合接口比面向对象具有更高的扩展性和灵活性。
1. 自定义类型、类型别名
1.1. 自定义类型
通过Type
关键字定义。
自定义类型是定义一个全新的类型。可以基于基本类型定义,也可以通过struct定义。
// 通过Type关键字的定义,MyInt就是一种新的类型,它具有int的特性。
type MyInt int
1.2. 类型别名
使用 “=” 定义,type TypeAlias = Type
类型别名规定:TypeAlias只是Type的别名,本质上属于同一个类型。
type intAlias = int// 内置别名类型type byte = uint8type rune = int32type any = interface{}
1.3. 类型定义和类型别名的区别
//类型定义
type NewInt int//类型别名
type MyInt = intfunc main() {var a NewIntvar b MyIntfmt.Printf("type of a:%T\n", a) //type of a:main.NewIntfmt.Printf("type of b:%T\n", b) //type of b:int
}
上面代码结果显示 a 的类型是 main.NewInt,表示 main 包下定义的 NewInt 类型;b 的类型是 int。MyInt 类型只会在代码中存在,编译完成时并不会有 MyInt 类型。
2. 结构体定义
- 结构体是一种自定义类型,它是由若干字段组成的。
- 结构体的字段可以是任意类型,甚至可以是结构体本身。
通过 struct
关键字定义。
type 类型名 struct {字段名 字段类型字段名 字段类型…
}类型名:同一个包内不能重复
字段名:同一个结构体内不能重复
字段类型:可以是任意类型,甚至可以是结构体本身
// 定义一个结构体
type Student struct {Name stringAge int
}
3. 结构体初始化
只有当结构体实例化时,才会分配内存。也就是必须实例化后才能使用结构体的字段。
未赋值字段,初始化为字段类型零值。
var stu Student
fmt.Printf("%#v\n", stu) // main.Student{Name:"", Age:0} // 通过点符号(.)访问结构体字段
stu.Name = "Tom"
fmt.Println(stu.Name)
使用键值对初始化
stu := Student{Name: "小花", Age: 18}
fmt.Println(stu)
使用值的列表初始化(简写:初始化时不写键,只写值)
需满足一下条件:
- 必须初始化结构体的所有字段。
- 初始值的填充顺序必须与字段在结构体中的声明顺序一致。
- 该方式不能和键值初始化方式混用。
stu := Student{"小明", 16}
fmt.Println(stu)
4. 指针类型结构体
初始化方式与值类型结构体相同,但使用指针类型进行初始化。
使用 new 关键字实例化
// new
var stu1 = new(Student)
fmt.Printf("%T \n", stu1)
使用 & 对结构体进行取址操作,相当于 new
stu := &Student{}
stu.Name = "小明"
(*stu).Age = 6
fmt.Printf("%#v\n", stu)
Go语法糖:会适时地为我们进行自动地转译,在stu之上,之所以我们可以通过stu.Name = "小明"
设置名字,是因为 Go语言把它自动转译为了(*stu).Name = "小明"
。
5. 构造函数
Go语言没有构造函数,我们可以自己实现。
struct是值类型,如果结构体比较复杂的话,值拷贝性能开销会比较大,所以该构造函数返回的是结构体指针类型。
type Student struct {Name stringAge int
}func NewStudent(name string, age int) *Student {return &Student{Name: name, Age: age}
}func main() {stu := NewStudent("小花", 18)fmt.Printf("%#v\n", stu)
}
6. 方法和接收者
Go语言中通过struct来实现面向对象;可以包含方法,方法是结构体的成员函数。
Go语言中的方法(Method)是一种作用于特定类型变量的函数。这种特定类型变量叫做接收者(Receiver)。接收者的概念就类似于其他语言中的 this 或者 self。
方法的接收者类型必须是某个自定义的数据类型,而且不能是接口类型或接口的指针类型。
函数与方法的区别:函数不属于任何类型,而方法属于特定的类型。
6.1. 方法定义
方法定义格式如下:
func (接收者 变量名) 方法名(参数列表)(返回值列表) {方法体
}
例如:
type Student struct {Name stringAge int
}func (stu *Student) SayHello(age int) {fmt.Printf("Hello, my name is %s, and %d years old.\n", stu.Name, age)
}
6.2. 方法调用
Go语言方法表达式有两种:instance.method(args…), .func(instance, args…)
func main() {stu := &Student{Name: "Tom",Age: 18,}stu.SayHello(18)// 隐式隐式sSay := stu.SayHellosSay(20)// 显式传递sr := (*Student).SayHellosr(stu, 22)
}
6.3. 值方法和指针方法
值方法:接收者类型是非指针的自定义数据类型的方法。
指针方法:接收者类型是指针的自定义数据类型的方法。
值方法与指针方法区别:
-
接受者类型:
- 值方法的接收者是该方法所属类型值的一个副本,在方法内对该副本的修改一般不会体现在原值上,除非这个类型本身是某个引用类型(slice、map、chan)。
- 指针方法的接收者是该方法所属类型值的指针的一个副本,在方法内对该副本指向的值进行修改一定会体现在原值上。
-
方法集合:一个自定义数据类型的方法集合中仅包含它的所有值方法;而该类型的指针类型的方法集合囊括了所有值方法和所有指针方法。
package mainimport "fmt"type Student struct {Name stringAge int
}// 指针方法
func (stu *Student) SetName(name string) {stu.Name = name
}// 值方法
func (stu Student) SetNameCopy(name string) {stu.Name = name
}func main() {stu := &Student{"小红", 20}stu.SetName("小花")fmt.Println(stu.Name) // 小花stu.SetNameCopy("小明")fmt.Println(stu.Name) // 小花
}
6.4. 指针方法使用场景
- 需要修改接收者中的值;
- 接收者是拷贝代价比较大的对象;
- 保证一致性,如果某个方法使用了指针接收者,那么其它方法也应该使用指针方法。
6.5. 任意类型添加方法
Go语言中,接收者的类型可以是任何类型,不仅仅是结构体,任何类型都可以拥有方法。
举个例子,我们基于内置的int类型使用type关键字可以定义新的自定义类型,然后为我们的自定义类型添加方法。
//MyInt 将int定义为自定义MyInt类型
type MyInt int//SayHello 为MyInt添加一个SayHello的方法
func (m MyInt) SayHello() {fmt.Println("Hello, 我是一个int。")
}func main() {var m MyIntm.SayHello() //Hello, 我是一个int。m = 100fmt.Printf("%#v %T\n", m, m) //100 main.MyInt
}
7. 结构体成员可见性
Go语言通过首字母的大小写来控制权限。首字母大写包外部可见,首字母小写仅包内部可见。
demo/struct.go
package demotype Student struct {Name string // 公共字段Age int score int // 包内字段,在包外部不可初始化
}// 公共方法
func (stu *Student) SetName(name string) {stu.Name = name
}// 包内方法
func (stu *Student) setScore(score int) {stu.score = score
}
main.go
package mianimport ("demo""fmt"
)func main() {stu := &demo.Student{Name: "小花", Age: 18}stu.SetName("小红")stu.setScore(80) // stu.setScore undefined (type *demo.Student has no field or method setScore)fmt.Println(stu)
}
8. 结构体匿名字段
结构体允许其成员字段在声明时没有字段名而只有类型,那么它就是一个嵌入字段,也可以被称为匿名字段。
匿名字段默认采用类型作为字段名,结构体要求字段名称必须唯一,因此一个结构体中同种类型的匿名字段只能有一个。
type BaseType struct {stringint
}func main() {var b = BaseType{}b.int = 10fmt.Println(b.int)
}
9. 嵌套结构体
一个结构体可以嵌套包含另一个结构体或结构体指针。
type Address struct {Province stringCity string
}type User struct {Name stringGender stringAddress Address
}func main() {user := User{Name: "pprof",Gender: "女",Address: Address{Province: "北京",City: "北京",},}fmt.Printf("user=%#v\n", use)
}
9.1. 嵌套匿名结构体
嵌套结构体字段也可以使用匿名。推荐使用匿名方式嵌套结构体,如下所示:
type User struct {Name stringGender stringAddress
}func main() {user := User{Name:"pprof", Gender:"女"}user.Address.Province = "北京"fmt.Printf("user=%#v\n", use)
}
9.2. 嵌套结构体的字段名冲突
嵌套结构体内部可能存在相同的字段名,为了避免歧义需要指定具体的内嵌结构体的字段。
仅匿名内嵌结构体成员可以直接访问。Go直接访问成员匹配规则:
- 结构体成员中含有要访问的成员,则匹配结构体成员。
- 结构体成员中没有要访问的成员,则在
内嵌匿名结构体
中继续查找。若同一层级多个内嵌匿名结构体存在同名成员,则产生歧义,报错。 - 内嵌结构体中未找到要访问的成员,若内嵌匿名结构体内还存在内嵌匿名结构体,则继续向下查找,依此类推。
- 都匹配不到则报错。
package maintype Student struct {Name stringAge intCreateTime stringAddressEmail}type Email struct {Account stringPhone stringCreateTime string
}type Address struct {Name stringProvince stringCity stringCounty stringPhone stringCreateTime string
}func (stu *Student) SetName(name string) {stu.Name = name
}func (addr *Address) SetName(name string) {addr.Name = name
}func (addr *Address) SetProvince(pro string) {addr.Province = pro
}func main() {var stu = &Student{}// 1. 嵌套结构体重名字段,需自定具体路径stu.CreateTime = "2023-12-21"stu.Address.CreateTime = "2023-12-30"// 2. 直接访问匿名结构体的字段名(当访问结构体成员时会先在结构体中查找该字段,找不到再去匿名结构体中查找。)stu.Account = "123@mail.com"// 3. 向下查找字段若同一层级出现重名字段,则产生歧义;需指定具体结构体字段。stu.Phone = "123123123" //报错:ambiguous selector stu.Phonestu.Address.Phone = "123123"// 结构体方法处理方式与字段相同stu.SetName("老北京")stu.Address.SetName("小北京")stu.SetProvince("北京市")fmt.Printf("%#v", stu)
}
10. 通过嵌套实现“继承”
type Animal struct {name string
}func (a *Animal) move() {fmt.Printf("%s会动!\n", a.name)
}type Dog struct {Feet int8*Animal // 通过嵌套匿名结构体实现继承
}func (d *Dog) wang() {fmt.Printf("%s会汪汪汪~\n", d.name)
}func main() {d := &Dog{Feet: 4,Animal: &Animal{ // 注意嵌套的是结构体指针name: "旺财",},}d.wang() //旺财会汪汪汪~d.move() //旺财会动!
}
11. 结构体与JSON序列化
package mainimport ("encoding/json""fmt"
)type Class struct {Title stringStudents []*Student
}type Student struct {Name stringAge intAddress
}type Address struct {Province stringCity stringCounty string
}func main() {c := &Class{Title: "高一(12)班",Students: make([]*Student, 0, 60),}for i := 1; i <= 10; i++ {stu := &Student{Name: fmt.Sprintf("Stu_%02d", i),Address: Address{Province: "北京"},}c.Students = append(c.Students, stu)}// JSON序列化:结构体 to JSONdata, err := json.Marshal(c)if err != nil {fmt.Println("Json marshal failed.")return}fmt.Printf("json:%s\n\n\n", data)// JSON反序列化:JSON to 结构体str := `{"Title":"101","Students":[{"Name":"小明","Age":16,"Address":{"Province":"北京"}},{"Name":"小花","Age":15,"Address":{"Province":"上海"}},{"Name":"小红","Age":16,"Address":{"Province":"广东"}}]}`c1 := &Class{}err = json.Unmarshal([]byte(str), c1)if err != nil {fmt.Println("json unmarshal failed!")return}fmt.Printf("%#v\n", c1)
}
12. 结构体标签(Tag)
Tag 是结构体的元信息,可以在运行的时候通过反射的机制读取出来。
结构体Tag在字段的后方定义,使用一对反引号(``)包括起来;由一个或多个键值对组成,键与值使用冒号分隔,值用双引号括起来,键值对之间使用一个空格分隔。
具体格式如下:
`key1:"value1" key2:"value2"`
**注意:为结构体编写Tag时,必须严格遵守键值对的规则。结构体标签的解析代码的容错能力很差,一旦格式写错,编译和运行时都不会提示任何错误,通过反射也无法正确取值。**例如:不要在key和value之间添加空格。
在结构体字段的定义中,如果字段名与 json 标签不一致,则需要在字段名后面添加一个 json 标签,如:
package mainimport ("encoding/json""fmt"
)type Student struct {Id int `json:"id"` //通过指定tag实现json序列化该字段时的keyName string `json:"name"`Age int `json:"-"` //通过指定tag实现json序列化该字段时忽略该字段Sex string `json:"name,omitempty"` // omitempty表示字段为空值时不序列化phone string //私有不能被json包访问
}func main() {stu := Student{Id: 1,Name: "小明",Age: 18,phone: "13333333333",}str, _ := json.Marshal(stu)fmt.Printf("json:%s\n", str) //json:{"id":1,"name":"小明"}str2, _ := json.Marshal(Student{Id: 2,Sex: "女",})fmt.Printf("json:%s\n", str2) //json:{"id":2,"name":"","sex":"女"}
}
13. 匿名结构体
在定义一些临时数据结构等场景下可以使用匿名结构体。
package mainimport ("fmt"
)func main() {var user struct{Name string; Age int}user.Name = "pprof.cn"user.Age = 18fmt.Printf("%#v\n", user)
}
相关文章:

Go基础编程 - 08 - 结构体
结构体 1. 自定义类型、类型别名1.1. 自定义类型1.2. 类型别名1.3. 类型定义和类型别名的区别 2. 结构体定义3. 结构体初始化4. 指针类型结构体5. 构造函数6. 方法和接收者6.1. 方法定义6.2. 方法调用6.3. 值方法和指针方法6.4. 指针方法使用场景6.5. 任意类型添加方法 7. 结构…...

基于Verilog表达的FSM状态机
基于Verilog表达的FSM状态机 1 FSM1.1 Intro1.2 Why FSM?1.3 How to do 在这里聚焦基于Verilog的三段式状态机编程; 1 FSM 1.1 Intro 状态机是一种代码实现功能的范式;一切皆可状态机; 状态机编程四要素:– 1.状态State&#…...

给一家银行做的数据中台系统架构方案书(DAMM)招投标用,虽然有内定潜规则,但是方案都是要的,不一定就是价格低就能中标,毕竟是上百万以上的单子
目录 概述需求分析系统架构DAMM设计思路数据治理数据安全实施计划维护和运营 1. 概述 1.1 项目背景 在数字化转型的浪潮中,银行业面临着越来越多的数据挑战与机遇。为了更好地利用数据资产,提升服务质量和运营效率,建立一个高效、灵活的数…...

【设计模式深度剖析】【6】【行为型】【中介者模式】
👈️上一篇:迭代器模式 | 下一篇:观察者模式👉️ 设计模式-专栏👈️ 文章目录 中介者模式定义英文原文直译如何理解? 中介者模式的角色1. 中介者(Mediator)2. 具体中介者(ConcreteMediato…...

金额转换但是接收对象类型未知时,金额转换公共方法囊括当对象为String\Integer\Number三种类型的转换方法
/** * deccription 金额转换方法 * param Object * value * return * return BigDecimal */ public BigDecimal getBigDecimal(Object value) { BigDecimal reValue new BigDecimal(0); if (value ! null) { …...

Commons-Collections篇-CC2链分析
前言 3.1-3.2.1版本中TransformingComparator并没有去实现Serializable接口,是不可以被序列化的,所以我们重新搭建一个4.0的具有漏洞的CC环境 CC2链主要使用的和CC4一样,但是区别在于CC2避免了使用Transformer数组,没有使用Insta…...

LeetCode 48.旋转图像
1.做题要求: 2.从此题我们可以看出规律为第几行要变为倒数第几列,所以我们最好先把二维数组存入一维数组中,然后先从最后一列遍历,把一维数组里的元素,依次等于遍历的元素即可: void rotate(int** matrix, int matrixSize, int*…...

Navicat导入json文件(json文件数据导入到MySQL表中)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...

避雷!又6本期刊被On Hold!ELSEVIER旗下影响因子高达10+SSCI上榜
【SciencePub学术】继《INFORMATION SCIENCES》被On Hold 之后,又新增3本SCIE期刊、3本SSCI期刊被列入On Hold名单。其中包含ELSEVIER旗下影响因子高达10的《RESOURCES POLICY》。 官方现在对期刊质量的管控越来越严格了,被标记为On Hold后的期刊中&…...

CSS 列表样式(ul)全面解析
CSS 列表样式是前端开发中常用的一种技术,用于定义无序列表(ul)的外观和行为。无序列表在网页布局和内容展示中扮演着重要角色,从导航菜单到内容清单,无所不在。通过CSS可以对无序列表的各个方面进行自定义,…...

Python 库PySpark,一个超级强大的数据处理引擎
目录 01初识 PySpark 为什么选择 PySpark? 安装 PySpark 配置 PySpark 02基本操作 创建 RDD 基本 RDD 操作 03DataFrame 和 Spark SQL 创建 DataFrame 基本 DataFrame 操作 使用 Spark SQL 04机器学习与流处理 …...

UE4_材质_雨滴涟漪效果ripple effect_ben教程
学习笔记,不喜勿喷!侵权立删,祝愿生活越来越好! 雨水落下时会产生这些非常漂亮的同心环波纹,我们要做的第一件事是创建一个单个的圆环遮罩动画,我们希望环在开始的时候在中心很小,然后放大&…...

mac免费的ntfs软件哪个好 MAC读取NTFS硬盘格式
对于苹果用户来说,Mac电脑和移动硬盘已经成为日常工作中不可缺少的一部分,但有时我发现Mac打开移动硬盘只能读取无法写入,这是由于所连接的移动硬盘为NTFS格式。我们可以通过对硬盘格式化为Mac正常读写格式,或使用数据读写软件对N…...

轻兔推荐 —— who.cx
via:轻兔推荐 - https://app.lighttools.net/ 简介 who.cx是一个域名whois查询工具,界面简洁,可查询域名基本信息,注册续费价格,支持查看一级域名解析记录 - 对于已注册域名可以查看注册商注册时间、 过期时间等基础信…...

建筑幕墙甲级设计资质:申请条件与评分标准
建筑幕墙甲级设计资质的申请条件与评分标准可以清晰归纳如下: 申请条件 一、企业基本情况 独立企业法人资格:企业需具有独立企业法人资格。注册资本:注册资本不少于300万元人民币。 二、技术人员条件 主要技术负责人或总工程师ÿ…...

easy-es Map类型字段序列化问题:Unexpected character (‘n‘ (code 110)):
Data IndexName("demo") public class EasyEsDemo {IndexIdprivate String id;private String name;private int age;// 这个Map字段因为NameFilter过滤器,导致fastjson序列化后为{null:"value"}这种形式,insert报错private Map<…...

[Vue3:组件通信)子组件props接收和watch监听,emit发送父组件 (添加修改设置成绩,添加、删除选课记录)
文章目录 一:系统功能:设置成绩(添加或修改)交互逻辑:涉及页面 Page02.vue,ModalEdit.vue主页面Page.vue注入子页面,使用子页面标签属性主页面对子页面做通信,子页面ModalEdit接收参…...

【网络协议栈】IGMP
IGMP IGMP(Internet Group Management Protocol)是互联网组管理协议的简称,属于TCP/IP协议族中负责IPv4组播成员管理的协议。以下是关于IGMP的详细介绍: 1 定义与作用 定义:IGMP是多播组成员的一种通信协议…...

Python机器学习完整流程:从数据清洗到推理落地
目录 一、引言 二、数据清洗 数据加载与初步探索 缺失值处理 异常值处理 特征编码与转换 数据集划分 三、模型训练 四、模型文件生成 五、模型部署与推理落地 六、总结 一、引言 在当今数据驱动的时代,机器学习已成为解决复杂问题的有力工具。而…...

App上架和推广前的准备
众所周知,App推广的第一步是上架各大应用下载市场,然后才是其他推广渠道。所以本文主要分两部分,第一部分主要介绍的是上架各大应用市场方面的准备,第二部分主要介绍的是其他渠道推广方面的准备。 一、App上架前的准备 1.1 上架…...

一季度直播6000场,同比增长60%,遥望科技透露重要信息
6月17日,经由深圳证券交易所许可,遥望科技(股票代码:002291)正式对《年报问询函》进行公开回复,就经营的多个维度做出解释和回应。 在回复中,遥望科技预测2024年毛利率为14.4%,相比…...

电商API接口是什么意思?有什么作用?
电商API接口是电子商务领域中一种技术解决方案,它允许不同的软件系统之间进行交互和数据交换。 在电商场景下,电商API接口可以实现的功能非常丰富,例如: 商品管理:获取商品列表、商品详情、搜索商品、上下架商品等&a…...

Python爬虫实战案例之——MySql数据入库
Hello大家好,我是你们的南枫学长,咱们今天来学——爬虫之MySql数据入库。 话不多说,导入咱们的老朋友: Pymysql就是我们Python里面的mysql库,主要功能就是用来连接MySql数据库,那么下载还是一样的操作去进…...

游戏中插入音效
一、背景音乐 准备:素材音乐 方法: 1、方法1: (1) 将背景音乐 bgAudio 拖放到Hierarchy面板 (2) 选中 bgAudio,勾选开始运行就播放、循环播放。调节音量(volume) 2、方法2: (1) Create Empty&#x…...

Redis缓存设计之常见问题及解决方案
背景:缓存的常见问题及对应的解决方案进行了整理,给大家分享一下。 1.缓存穿透 缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储 层查不到数据则不写入缓存层。 缓…...

简单的线程池示例
线程池可以有效地管理和重用线程资源,避免频繁创建和销毁线程带来的开销。以下是一个简单的线程池示例。 cpp #include <iostream> #include <vector> #include <thread> #include <queue> #include <mutex> #include <condition…...

IT入门知识第三部分《软件开发》(3/10)
目录 IT入门知识大纲第三部分《软件开发》 1. 软件开发生命周期(SDLC) 1.1 需求分析 1.2 软件设计 1.3 程序编码 1.4 软件测试 1.5 项目部署 1.6 运行维护 2. 软件开发方法论 2.1 瀑布模型 2.2 敏捷开发 2.2.1 Scrum 2.2.2 Kanban 2.3 Dev…...

卫星通讯助力船舶可视化监控:EasyCVR视频汇聚系统新应用
一、背景 随着科技的不断进步和社会治安的日益严峻,视频监控系统已经成为维护公共安全和提升管理效率的重要工具。传统的视频监控主要依赖于有线传输,但受到地域限制、布线成本高等因素的影响,其应用范围和效果受到一定限制。而卫星通讯传输…...

gcn+tcn+transformer入侵检测
gcn gcn_out self.gcn(A_hat, D_hat, X) 的公式实际上是图卷积网络(GCN)层的核心操作。具体来说,这一步的计算基于图卷积的基本公式: H ( l 1 ) σ ( D ^ − 1 / 2 A ^ D ^ − 1 / 2 H ( l ) W ( l ) ) H^{(l1)} \sigma\left…...

【Python】 了解二分类:机器学习中的基础任务
我已经从你的 全世界路过 像一颗流星 划过命运 的天空 很多话忍住了 不能说出口 珍藏在 我的心中 只留下一些回忆 🎵 牛奶咖啡《从你的全世界路过》 在机器学习和数据科学领域,分类问题是最常见的任务之一。分类问题可以分为多类分…...