2026-01-11 12:41:00 +08:00
|
|
|
# 结构体
|
|
|
|
|
|
2026-01-11 13:56:26 +08:00
|
|
|

|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-11 13:56:26 +08:00
|
|
|
我们前面介绍的数组 只能保存同一种类型的数据, 当我们需要记录多种不同类型的数据时,我们该怎么办?
|
|
|
|
|
|
|
|
|
|
结构体就是用于解决这个问题的, 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合, 方便容量我们的任意类型的数据
|
|
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
[课件地址](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/struct.md)
|
2026-01-11 13:56:26 +08:00
|
|
|
|
|
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
## 数据结构
|
2026-01-11 13:56:26 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
+ 基础数据结构: int, float, bool, string, byte(int8), rune
|
|
|
|
|
+ 复合数据结构: array, sice, map
|
2026-01-11 13:56:26 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
处理人员相关信息
|
|
|
|
|
```sh
|
|
|
|
|
单独变量方式:
|
|
|
|
|
├── name (string) - 姓名
|
|
|
|
|
├── age (int) - 年龄
|
|
|
|
|
├── gender (string) - 性别
|
|
|
|
|
├── weight (uint) - 体重
|
|
|
|
|
└── favoriteColor ([]string) - 喜欢的颜色
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
var (
|
|
|
|
|
name string
|
|
|
|
|
age int
|
|
|
|
|
gender string
|
|
|
|
|
weight uint
|
|
|
|
|
favoriteColor []string
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func handlePerson(name string, age int, gender string, weight uint, favoriteColor []string) error
|
|
|
|
|
```
|
2026-01-11 13:56:26 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
根据业务需要自己进行 数据定义,这就是结构体(struct)
|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
```go
|
|
|
|
|
type Person struct {
|
|
|
|
|
Name string
|
|
|
|
|
Age int
|
|
|
|
|
Gender string
|
|
|
|
|
Weight uint
|
|
|
|
|
FavoriteColor []string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
func handlePerson(*Person) error
|
|
|
|
|
```
|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
```go
|
|
|
|
|
// person 结构体类型的初始化
|
|
|
|
|
// 把struct上这些变量 赋值的过程 就叫实例化
|
|
|
|
|
p1 := Person{
|
|
|
|
|
Name: "张三",
|
|
|
|
|
Age: 18,
|
|
|
|
|
Gender: GenderMale,
|
|
|
|
|
Weight: 150,
|
|
|
|
|
FavoriteColor: []string{
|
|
|
|
|
"红色",
|
|
|
|
|
"绿色",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
```
|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
## 声明与初始化
|
2026-01-11 12:41:00 +08:00
|
|
|
|
|
|
|
|
```go
|
2026-01-25 18:08:25 +08:00
|
|
|
// 定义类型(struct)
|
|
|
|
|
type Person struct {
|
|
|
|
|
Name string
|
|
|
|
|
Age int
|
|
|
|
|
Gender string
|
|
|
|
|
Weight uint
|
|
|
|
|
FavoriteColor []string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 声明并初始化
|
|
|
|
|
// var Person
|
|
|
|
|
p2 := Person{
|
|
|
|
|
Name: "李四",
|
|
|
|
|
Age: 20,
|
|
|
|
|
Gender: GenderFemale,
|
|
|
|
|
Weight: 120,
|
|
|
|
|
FavoriteColor: []string{
|
|
|
|
|
"蓝色",
|
|
|
|
|
"黑色",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
// var *Person
|
|
|
|
|
p3 := &Person{
|
|
|
|
|
Name: "李四",
|
|
|
|
|
Age: 20,
|
|
|
|
|
Gender: GenderFemale,
|
|
|
|
|
Weight: 120,
|
|
|
|
|
FavoriteColor: []string{
|
|
|
|
|
"蓝色",
|
|
|
|
|
"黑色",
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 使用结构体
|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
可以参考map的使用方式, 或者一组带名称空间的变量
|
|
|
|
|
|
|
|
|
|
```go
|
|
|
|
|
// 访问结构体字段
|
|
|
|
|
fmt.Println(p2.age)
|
|
|
|
|
// 修改结构体字段
|
|
|
|
|
p2.age = 22
|
|
|
|
|
fmt.Println(p2.age)
|
2026-01-11 12:41:00 +08:00
|
|
|
```
|
|
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
## 指针
|
2026-01-11 12:41:00 +08:00
|
|
|
|
2026-01-25 18:08:25 +08:00
|
|
|
自动解开引用
|
|
|
|
|
```go
|
|
|
|
|
// ChangePersonAge 修改Person的年龄
|
|
|
|
|
func ChangePersonAge(p *Person, newAge int) {
|
|
|
|
|
// 自动解开引用(*p)
|
|
|
|
|
// * -> 解引用(Unbox)
|
|
|
|
|
// (*p).age = newAge
|
|
|
|
|
// p 指针类型, 自动解引用
|
|
|
|
|
// . 访问字段
|
|
|
|
|
// 自动解引用
|
|
|
|
|
// p.age == (*p).age
|
|
|
|
|
// 所以可以直接写成下面这样
|
|
|
|
|
p.age = newAge
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// func ChangeAge(age *int, newAge int) {
|
|
|
|
|
// *age = newAge
|
|
|
|
|
// }
|
|
|
|
|
```
|
2026-01-11 12:41:00 +08:00
|
|
|
|