From 7b4fc69de03725c5108c0eda73abd38eefa6ea50 Mon Sep 17 00:00:00 2001 From: pengshiyu <1940607002@qq.com> Date: Thu, 22 Sep 2022 22:40:13 +0800 Subject: [PATCH] fix --- blog/golang/golang-interface.md | 89 +++++++++++++++++ blog/golang/golang-struct.md | 165 ++++++++++++++++++++++++++++++++ blog/golang/index.md | 5 +- 3 files changed, 257 insertions(+), 2 deletions(-) create mode 100644 blog/golang/golang-interface.md diff --git a/blog/golang/golang-interface.md b/blog/golang/golang-interface.md new file mode 100644 index 0000000..4be487e --- /dev/null +++ b/blog/golang/golang-interface.md @@ -0,0 +1,89 @@ +# 第十八章 Golang接口 interface + +go语言中的接口,是一种新的类型定义,它把所有的具有共性的方法定义在一起,任何其他类型制药实现了这些方法就是实现了这个接口 + + +语法 + +```go +// 定义接口 +type interface_name interface { + method_name [return_type] + ... +} + +// 定义结构体 +type struct_name struct { + +} + +// 实现接口方法 +func (struct_name_variable struct_name) method_name [return_type]{ + // 方法实现 +} +``` + +接口示例 + +定义一个USB接口,有读read 写write两个方法 + +再定义一个电脑computer 和 手机Mobile 来实现这个接口 + +```go +package main + +import "fmt" + +// USB接口 +type USB interface { + read() + write() +} + +// Computer 结构体 +type Computer struct { +} + +// Mobile 结构体 +type Mobile struct { +} + +// Computer 实现USB方法 +func (computer Computer) read() { + fmt.Println("computer read") +} + +func (computer Computer) write() { + fmt.Println("computer write") +} + +// Mobile 实现USB方法 +func (mobile Mobile) read() { + fmt.Println("mobile read") +} + +func (mobile Mobile) write() { + fmt.Println("mobile write") +} + +func main() { + + computer := Computer{} + computer.read() + computer.write() + // computer read + // computer write + + mobile := Mobile{} + mobile.read() + mobile.write() + // mobile read + // mobile write + +} + +``` + +> 备注: 实现接口必须实现接口中的所有方法 + + diff --git a/blog/golang/golang-struct.md b/blog/golang/golang-struct.md index 2776fa2..24ccafb 100644 --- a/blog/golang/golang-struct.md +++ b/blog/golang/golang-struct.md @@ -360,6 +360,7 @@ func main() { var person = new(Person) // 访问结构体指针成员,可以省略* + // 自动解引用 (*person).age = 23 person.id = 12 person.name = "Tom" @@ -460,3 +461,167 @@ func main() { } ``` +## 结构体的嵌套 + +示例 + +```go +package main + +import "fmt" + +type Dog struct { + age int + name string +} + +type Person struct { + age int + name string + dog Dog +} + +func main() { + dog := Dog{ + age: 1, + name: "dog", + } + + person := Person{ + dog: dog, + age: 11, + name: "Tom", + } + + fmt.Printf("%v\n", person) + // {11 Tom {1 dog}} + + fmt.Printf("%v\n", person.dog.name) + // dog +} + + +``` + +## 方法 + +golang中,方法是一种特殊的函数 + +定义与struct之上(与struct关联、绑定),被称为struct的接受者(receiver) + +通俗讲,方法就是有接收者的函数 + +语法格式 + +```go +type struct_name struct{} + +func (recv struct_name) method_name(param_type) return_type{} + +func (recv *struct_name) method_name(param_type) return_type{} +``` + + + +```go +package main + +import "fmt" + +// 属性和方法分开写 +type Person struct { + age int + name string +} + +// Person 接收者 receiver +func (person Person) eat() { + fmt.Printf("%v eat\n", person.name) +} + +func (person Person) sleep() { + fmt.Printf("%v sleep\n", person.name) +} + +func main() { + + person := Person{ + age: 11, + name: "Tom", + } + + person.eat() + // Tom eat + + person.sleep() + // Tom sleep +} + +``` + +go语言方法的注意事项 + +- 方法的receiver type可以是类型别名、struct、slice、map、channel、func等 +- struct结合它的方法等价于面向对象中的类,只不过struct可以和它的方法分开写,并非一定要属于同一个文件,但是,必须属于同一个包 +- 方法有两种接收类型`(T type)` 和 `(T *Type)`,它们之间有区别 +- 方法就是函数,所有Go中没有方法重载overload的说法,也就是说同一个类型中的所有方法名必须唯一 +- 如果receiver是一个指针类型,则会自动解除引用 +- 方法和type是分开的,意味着实例的行为behavior和数据存储field是分开的,但它们通过receiver建立起关联关系 + +## 方法接收者类型 + +- 值类型:复制结构体副本 +- 指针类型:不复制 + +```go +package main + +import "fmt" + +// Person 接收者 receiver +type Person struct { + age int + name string +} + +// 值传递,拷贝了一份副本 +func (person Person) showPersonByValue() { + person.age = 12 + person.name = "Jack" + + fmt.Printf("%v\n", person) +} + +// 指针传递 +func (person *Person) showPersonByPointer() { + person.age = 12 + person.name = "Jack" + + fmt.Printf("%v\n", person) +} + +func main() { + + person := Person{ + age: 11, + name: "Tom", + } + + fmt.Printf("%v\n", person) + // {11 Tom} + + // 接收者类型是变量,值没有被修改 + person.showPersonByValue() + // {12 Jack} + + fmt.Printf("%v\n", person) + // {11 Tom} + + // 接收者类型是指针,值被修改 + person.showPersonByPointer() + // &{12 Jack} + + fmt.Printf("%v\n", person) + // {12 Jack} +} +``` \ No newline at end of file diff --git a/blog/golang/index.md b/blog/golang/index.md index 7ad500b..412e085 100644 --- a/blog/golang/index.md +++ b/blog/golang/index.md @@ -42,9 +42,10 @@ [第十七章 Golang 结构体 struct](/blog/golang/golang-struct.md) +[第十八章 Golang接口 interface](/blog/golang/golang-interface.md) -https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da +https://www.bilibili.com/video/BV1ME411Y71o?p=27&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da -https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=54&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file +https://www.bilibili.com/video/BV1zR4y1t7Wj/?p=58&spm_id_from=pageDriver&vd_source=efbb4dc944fa761b6e016ce2ca5933da \ No newline at end of file -- GitLab