# 结构体 ![alt text](image.png) 我们前面介绍的数组 只能保存同一种类型的数据, 当我们需要记录多种不同类型的数据时,我们该怎么办? 结构体就是用于解决这个问题的, 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合, 方便容量我们的任意类型的数据 [课件地址](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/struct.md) ## 数据结构 + 基础数据结构: int, float, bool, string, byte(int8), rune + 复合数据结构: array, sice, map 处理人员相关信息 ```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 ``` 根据业务需要自己进行 数据定义,这就是结构体(struct) ```go type Person struct { Name string Age int Gender string Weight uint FavoriteColor []string } func handlePerson(*Person) error ``` ```go // person 结构体类型的初始化 // 把struct上这些变量 赋值的过程 就叫实例化 p1 := Person{ Name: "张三", Age: 18, Gender: GenderMale, Weight: 150, FavoriteColor: []string{ "红色", "绿色", }, } ``` ## 声明与初始化 ```go // 定义类型(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的使用方式, 或者一组带名称空间的变量 ```go // 访问结构体字段 fmt.Println(p2.age) // 修改结构体字段 p2.age = 22 fmt.Println(p2.age) ``` ## 指针 自动解开引用 ```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 // } ```