yumaojun03 fef15daccb ```
docs(day03): 更新第三天课程内容包含结构体和错误处理

- 在README.md中添加了Go语言函数、defer与异常、Go语言结构体的链接
- 在error目录下添加了defer与异常课件链接
- 在struct目录下完善了结构体相关文档,包括:
  - 添加了课件地址
  - 详细介绍了数据结构概念
  - 提供了结构体定义和初始化的完整示例
  - 展示了结构体的使用方法和指针操作
- 新增struct/main.go文件,包含完整的结构体演示代码
```
2026-01-25 18:08:25 +08:00
..
```
2026-01-25 09:11:18 +08:00
```
2026-01-25 18:08:25 +08:00
```
2026-01-25 18:08:25 +08:00

结构体

alt text

我们前面介绍的数组 只能保存同一种类型的数据, 当我们需要记录多种不同类型的数据时,我们该怎么办?

结构体就是用于解决这个问题的, 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合, 方便容量我们的任意类型的数据

课件地址

数据结构

  • 基础数据结构: int, float, bool, string, byte(int8), rune
  • 复合数据结构: array, sice, map

处理人员相关信息

单独变量方式:
├── name (string) - 姓名
├── age (int) - 年龄
├── gender (string) - 性别
├── weight (uint) - 体重
└── favoriteColor ([]string) - 喜欢的颜色
var (
    name string
    age int 
    gender string
    weight uint
    favoriteColor []string
)

func handlePerson(name string, age int, gender string, weight uint, favoriteColor []string) error

根据业务需要自己进行 数据定义,这就是结构体(struct)

type Person struct {
	Name          string
	Age           int
	Gender        string
	Weight        uint
	FavoriteColor []string
}


func handlePerson(*Person) error
// person 结构体类型的初始化
// 把struct上这些变量 赋值的过程 就叫实例化
p1 := Person{
    Name:   "张三",
    Age:    18,
    Gender: GenderMale,
    Weight: 150,
    FavoriteColor: []string{
        "红色",
        "绿色",
    },
}

声明与初始化

// 定义类型(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{
        "蓝色",
        "黑色",
    },
}

使用结构体

可以参考map的使用方式, 或者一组带名称空间的变量

// 访问结构体字段
fmt.Println(p2.age)
// 修改结构体字段
p2.age = 22
fmt.Println(p2.age)

指针

自动解开引用

// 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
// }