diff --git a/day03/README.md b/day03/README.md index 40a9ef3..94955f0 100644 --- a/day03/README.md +++ b/day03/README.md @@ -6,6 +6,6 @@ + [Go语言函数](./function/README.md) + [defer与异常](./error/README.md) -+ Go语言结构体 ++ [Go语言结构体](./struct/README.md) + Go语言指针 + 扩展反射与内存对齐 \ No newline at end of file diff --git a/day03/error/README.md b/day03/error/README.md index 01ad60a..ee1227f 100644 --- a/day03/error/README.md +++ b/day03/error/README.md @@ -2,6 +2,8 @@ 程序运行过程中,可能会有异常,比如: 输入参数错误,文件不存在,数据库连接失败等等 +[defer与异常课件](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/error.md#defer%E7%9A%84%E5%BA%94%E7%94%A8) + ## error (程序异常) ### 处理 error diff --git a/day03/struct/README.md b/day03/struct/README.md index 259f1e9..06030d9 100644 --- a/day03/struct/README.md +++ b/day03/struct/README.md @@ -6,26 +6,134 @@ 结构体就是用于解决这个问题的, 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合, 方便容量我们的任意类型的数据 - -## 结构体的定义 +[课件地址](https://gitee.com/infraboard/go-course/blob/master/zh-cn/base/struct.md) +## 数据结构 ++ 基础数据结构: int, float, bool, string, byte(int8), rune ++ 复合数据结构: array, sice, map -## 指针数组(重要: 95%) - -指针数组: 创建一个数组,里面存放指针,指针指向数组的某一个元素 - -盒子(数组)里面的插槽,嵌套盒子(指针)的模式 - - -```go -type Person struct {} - -// -[]*Person{} +处理人员相关信息 +```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 +// } +``` diff --git a/day03/struct/main.go b/day03/struct/main.go new file mode 100644 index 0000000..c8763d2 --- /dev/null +++ b/day03/struct/main.go @@ -0,0 +1,94 @@ +package main + +import "fmt" + +func main() { + + // slice 类型的初始化 + arr := []int{1, 2, 3} + fmt.Println(arr) + + // map类型的初始化 + m1 := map[string]int{ + "张三": 18, + "李四": 20, + } + fmt.Println(m1) + + // person 结构体类型的初始化 + p1 := Person{ + Name: "张三", + age: 18, + Gender: GenderMale, + Weight: 150, + FavoriteColor: []string{ + "红色", + "绿色", + }, + } + fmt.Println(p1) + + p2 := Person{ + Name: "李四", + age: 20, + Gender: GenderFemale, + Weight: 120, + FavoriteColor: []string{ + "蓝色", + "黑色", + }, + } + // p3 := Person{} + // p3 := new(Person) + fmt.Println(p2) + + // 访问结构体字段 + fmt.Println(p2.age) + // 修改结构体字段 + p2.age = 22 + fmt.Println(p2.age) + + ChangePersonAge(&p2, 30) + fmt.Println("ChangePersonAge", p2.age) +} + +// Person 是一个表示人的结构体,包含姓名、年龄、性别、体重和喜欢的颜色等字段。 +// 也是一个复合数据类型。 +type Person struct { + Name string + // 不对外暴露的字段 + age int + Gender Gender + Weight uint + FavoriteColor []string +} + +// GenderXXX 表示枚举值 +// Gender 是一种自定义类型,底层类型是 int +// Gender != int +type Gender int + +// Sex == Gender +type Sex = Gender + +const ( + GenderMale Gender = iota + GenderFemale +) + +// 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 +// }