From 7004dc10c7e09f30aafc493a45e6276c6fe9b4f9 Mon Sep 17 00:00:00 2001 From: linlongchen Date: Tue, 16 Jun 2020 23:00:32 +0800 Subject: [PATCH] method go --- .../04复合类型/moretype指针和复合类型.md | 374 ++++++++++++++++++ .../05方法和接口/Golang基础-方法和接口.png | Bin 0 -> 51020 bytes .../go/tour_go/05方法和接口/method_and_if.md | 326 +++++++++++++++ 3 files changed, 700 insertions(+) create mode 100644 _posts/go/tour_go/04复合类型/moretype指针和复合类型.md create mode 100644 _posts/go/tour_go/05方法和接口/Golang基础-方法和接口.png create mode 100644 _posts/go/tour_go/05方法和接口/method_and_if.md diff --git a/_posts/go/tour_go/04复合类型/moretype指针和复合类型.md b/_posts/go/tour_go/04复合类型/moretype指针和复合类型.md new file mode 100644 index 0000000..da7bf73 --- /dev/null +++ b/_posts/go/tour_go/04复合类型/moretype指针和复合类型.md @@ -0,0 +1,374 @@ +> 对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握。基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Golang 这趟新车。 + +前面我们学习了 Golang 中基础数据类型,比如内置类型 `int` `string` `bool` 等,还有一些复杂一点点,但很好用的复合类型,类似 C 中的数组和 `struct`、C++ 中的 `map` ,今天我们就来学习 Go 中的复合类型。 + +通过本文的学习你将掌握以下知识: + +- 结构体 +- 指针类型 +- 数组和切片 +- 映射类型 +- 遍历切片和映射 + + + +## 结构体 + +结构体是一种聚合的数据类型,与 C 中的结构体类似,是由零个或多个任意类型的值聚合成的实体。每个值称为结构体的成员,看例子: + +```go +type Test struct { + a int + b int + } +``` + +语法上的不同看到了吗? 每个结构体字段之后没有分号(还记得前面文章说过 Go 会自动加分号吧)没有分号写起来还是很舒服的。 + + + +### 初始化 + +可以在定义的时候初始化 + +```go +test := Test{1, 2} // 定义结构体变量并初始化 +``` + +初始化部分结构体字段 + +```go +t2 = Test{a: 3} //指定赋值Test.a为3 Test.b隐式赋值0 +``` + +隐式初始化 + +```go +t3 = Test{} // .a .b都隐式赋值0 +``` + +多个变量可以分组一起赋值 + +```go +var ( + t1 = Test{8, 6} + t2 = Test{a: 3} //指定赋值Test.a Test.b隐式赋值0 + t3 = Test{} // .a .b都隐式赋值0 +) +``` + + + +### 访问成员 + +通过 `.` 运算来访问结构体成员,「不区分结构体类型或是结构体指针类型」都可以用 `.` 号来访问。 + +```go +fmt.Println("struct", st0.a, st0.b) // 通过 . 运算来访问结构体成员 +``` + + + +对于只声明没赋值的结构体,其内部变量被赋予零值。下面我们声明了 `st0` 但没有对其赋值,成员 a 和 b 自动赋零值。 + +```go +var st0 Test +fmt.Println("struct", st0.a, st0.b) //输出:struct 0 0 +``` + + + +## 指针 + +指针不保存实际数据的内容,而是保存了指向值的内存地址 。用 `&` 对变量取内存地址,用 `*` 来访问指向的内存,这点和 C 中的指针是一样,唯一不同的是 Go 中的指针不能运算。 + +```go + a := 3 + pa := &a // 用 `&` 对变量取内存地址 + fmt.Println("point", a, *pa) // 用 `*` 来访问指向的内存 +``` + +只声明没赋值的指针值是 `nil` ,代表空指针。 + +```go + var a0 *int // 只声明没赋值的指针是nil + if a0 == nil { + fmt.Println("point", "it is nil point") + } +``` + + + +## 数组 + + 数组是一个由固定长度的特定类型元素组成的序列,一个数组可以由零个或多个元素组成。 数组可以用下标访问元素,下标从 0 开始。 + +数组声明后赋值 + +```go + var strarr [2]string // 数组声明语法 + strarr[0] = "ready" + strarr[1] = "go" +``` + +声明赋值同时完成 + +```go + intarr := [5]int{6, 8, 9, 10, 7} // 声明赋值同时完成 +``` + +对于确定初始值个数的数组,可以省略数组长度用 `...` 代替。 + +```go + intarr := [...]int{6, 8, 9, 10, 7} // 声明赋值同时完成 +``` + + + +## Slice 切片 + +切片是变长的序列,序列中每个元素都有相同的类型。`slice` 语法和数组很像,只是没有固定长度而已,「切片底层引用一个数组对象」修改切片会修改原数组。 + +通过切片可以访问数组的部分或全部元素,正因为切片长度不是固定的,因此切片比数组更加的常用。 + + + +### 声明与初始化 + +#### 常规初始化 + +简短声明并初始化切片 + +```go +s0 := []int{1, 2, 3, 4, 5, 6} // 简短声明加赋值 +``` + +声明后再初始化 + +```go +var s []int // 声明切片s +s = s0 // 用切片s0初始化切片s +``` + +声明并初始化切片 + +```go +var s00 []int = s0 // 用切片s0初始化切片s +``` + +切片的零值是 `nil` + +```go +// 切片的零值是nil 空切片长度和容量都是0 +var nilslice []int +if nilslice == nil { + fmt.Println("slice", "nilslice is nil ", len(nilslice), cap(nilslice)) +} + +``` + +#### make初始化 + +除了上述的常规初始化方法,还可以用 `make` 内置函数来创建切片 + +```go +// 内建函数make创建切片,指定切片长度和容量 +// make 函数会分配一个元素为零值的数组并返回一个引用了它的切片 +s2 := make([]int, 4, 6) //创建元素都是0的切片s2, 长度为4,容量为6 第三个参数可以省略 +fmt.Println("slice", len(s2), cap(s2), s2) +``` + + + +#### 切片长度和容量 + + 切片长度表示切片中元素的数目,可用内置函数 `len` 函数得到。 + + 容量表示切片中第一个元素到引用的底层数组结尾所包含元素个数,可用内置函数 `cap` 求得。 + +```go +s0 := []int{1, 2, 3, 4, 5, 6} // 简短声明加赋值 +len1, cap1 := len(s0), cap(s0) +len2, cap2 := len(s0[:4]), cap(s0[:4]) +len3, cap3 := len(s0[2:]), cap(s0[2:]) +fmt.Println("slice", len1, cap1, len2, cap2, len3, cap3) // 6 6 4 6 4 4 +``` + + + +#### 切片区间 + +切片区间遵循「左闭右开」原则, + +```go +s0 := [5]int{6, 8, 9, 10, 7} // 数组定义 +var slice []int = intarr[1:4] // 创建切片slice 包含数组子序列 +``` + + 默认上下界。切片下界的默认值为 0,上界默认是该切片的长度。 + +```go +fmt.Println("slice", s0[:], s0[0:], s0[:5], s0[0:5]) // 这四个切片相同 +``` + + + +### 切片append操作 + +append 函数用于在切片末尾追加新元素。 + +添加元素也分两种情况。 + +#### 添加之后长度还在原切片容量范围内 + +```go +s2 := make([]int, 4, 6) // 创建元素都是0的切片s2, 长度为4,容量为6 第三个参数可以省略 +s21 := append(s2, 1) +s22 := append(s2, 2) // append每次都是在最后添加,此时,s21 s22指向同一个底层数组;但s2不改变! +fmt.Println(s2, s21, s22) // [0 0 0 0] [0 0 0 0 2] [0 0 0 0 2] +``` + + +#### 添加元素之后长度超出原切片容量 + +此时会分配新的数组空间,并返回指向这个新分配的数组的切片。 + +下面例子中 s24 切片已经指向新分配的数组,s22 依然指向的是原来的数组空间,而 s24 已经指向了新的底层数组。 + +```go + s24 := append(s2, 1, 2, 3) + fmt.Println(s24, s22) // s24 [0 0 0 0 1 2 3] [0 0 0 0 2] +``` + +### 二维切片 + +可以定义切片的切片,类似其他语言中的二维数组用法。参考代码: + +```go + s3 := [][]int{ + {1, 1, 1}, + {2, 2, 2}, + } + fmt.Println(s3, s3[0], len(s3), cap(s3)) // 输出: [[1 1 1] [2 2 2]] [1 1 1] 2 2 +``` + + + +## map 映射类型 + +在 Go 中 `map` 是键值对类型,代表 `key` 和` value` 的映射关系,一个 map 就是一个哈希表的引用 。 + +### 定义和初始化 + +下面这样定义并初始化一个 map 变量 + +```go + m0 := map[int]string{ + 0: "0", + 1: "1", + } +``` + +也可以用内置 make 函数来初始化一个 map 变量,后续再向其中添加键值对。像下面这样: + +```go + m1 := make(map[int]string) // make 函数会返回给定类型的映射,并将其初始化备用 + if m1 != nil { + fmt.Println("map", "m1 is not nil", m1) // m1 不是nil + } + m1[0] = "1" + m1[1] = "2" +``` + +注意:只声明不初始化的map变量是 `nil` 映射,不能直接拿来用! + +```go + var m map[int]string // 未初始化的m零值是nil映射 + if m == nil { + fmt.Println("map", "m is nil", m) + } + //m[0] = "1" // 这句引发panic异常, 映射的零值为 nil 。nil映射既没有键,也不能添加键。 +``` + +### 元素读取 + +使用语法:`vaule= m[key]` 获取键 key 对应的元素 vaule 。 + +上面我们只用了一个变量来获取元素,其实这个操作会返回两个值,第一个返回值代表读书的元素,第二个返回值是代表键是否存在的 bool 类型,举例说明: + +```go + v, st := m1[0] // v是元素值,下标对应的元素存在st=true 否则st=false + _, st1 := m1[0] // _ 符号表示忽略第一个元素 + v1, _ := m1[0] // _ 符号表示忽略第二个元素 + fmt.Println(v, st, v1, st1, m1[2]) // m1[2]不存在,返回元素string的零值「空字符」 +``` + +### 删除元素 + +内置函数 `delete` 可以删除 map 元素,举例: + +``` +delete(m1, 1) // 删除键是 1 的元素 +``` + + + +## range 遍历 + +range 用于遍历 切片 或 映射。 + +### 数组或切片遍历 + +当使用` for` 循环和 `range` 遍历数组或切片时,每次迭代都会返回两个值。第一个值为当前元素的下标,第二个值为该下标所对应元素的一份副本。 + +```go +s1 := []int{1, 2, 3, 4, 5, 6} +for key, vaule := range s1 { + fmt.Println("range", key, vaule) +} + +for key := range s1 { // 只需要索引,忽略第二个变量即可 + fmt.Println("range", key) +} + +for _, vaule := range s1 { // 只需要元素值,用'_'忽略索引 + fmt.Println("range", vaule) +} +``` + + + +### map 遍历 + +当使用` for` 循环和 `range` 遍历` map` 时,每次迭代都会返回两个值。第一个值为当前元素 `key` , 第二个值是 `value`。 + +```go +m0 := map[int]string{ + 0: "0", + 1: "1", +} +fmt.Println("map", m0) + +for k, v := range m0 { // range遍历映射,返回key 和 vaule + fmt.Println("map", "m0 key:", k, "vaule:", v) +} +``` + + + +## 总结 + +通过本文的学习,我们掌握了 Golang 中复合类型的学习,这些复合类型代表的数据结构都比较常见,比如切片和数组可以用于模仿队列或堆栈,`map` 的底层实现是 `hash` 表,当然初学者可以不必在意这些底层实现,先用起来已经领先大部分观望者。 + +感谢各位的阅读,文章的目的是分享对知识的理解,技术类文章我都会反复求证以求最大程度保证准确性,若文中出现明显纰漏也欢迎指出,我们一起在探讨中学习. + +今天的技术分享就到这里,我们下期再见。 + +----- + + + +**创作不易,白票不是好习惯,如果有收获,动动手指点个「在看」或给个「转发」是对我持续创作的最大支持** + +## + diff --git a/_posts/go/tour_go/05方法和接口/Golang基础-方法和接口.png b/_posts/go/tour_go/05方法和接口/Golang基础-方法和接口.png new file mode 100644 index 0000000000000000000000000000000000000000..0f977e42f1277e91d15c9a213291ffc4ac43db30 GIT binary patch literal 51020 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 z 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 对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握。基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Golang 这趟新车。 + +最近工作上和生活上的事情都很多,这篇文章计划是周末发的,但是周末太忙时间不够,同时为了保证文章质量,反复修改到现在才算完成。 + +有时候还是很想回到学校,一心只用读书睡觉打游戏的日子,成年人的世界总是被各种中断,有各种各样的事情要处理。 + + ![img](https://i04piccdn.sogoucdn.com/a4eabef05f7da82e) + +**答应大家要写完的 Go 基础系列可能会迟到,但不会缺席。今天我们来继续学习,Go 中的面向对象编程思想,包括 方法 和 接口 两大部分学习内容。** + +通过学习本文,你将了解: + +- Go 的方法定义 +- 方法和函数的区别 +- 方法传值和传指针差异 +- 什么是接口类型 +- 如何判断接口底层值类型 +- 什么是空接口 +- nil 接口 和nil 底层值 + + + +如果你使用 C++ 或 Java 这类面向对象的语言,肯定知道类 `class` 和方法 `method` 的概念,Golang 中没有` class `关键字,但有上节介绍的 `struct` 结构体提供类似功能,配合方法和接口的支持,完成面向对象的程序设计完全没有问题,下面我们就来学习下方法和接口。 + +## 方法 + +### 定义 + +方法就是一类带特殊的接收者参数的函数 ,这些特殊的参数可以是结构体也可以是结构体指针,但不能是内置类型。 + +为了便于说明,先来定义一个结构体 `Person` 包含` name `和 `age` 属性。 + +```go +type Person struct { + name string + age int +} +``` + +下面给 `Person` 定义两个方法,分别用于获取` name `和` age ` ,重点看下代码中方法的定义语法。 + +```go +func (p Person) GetName() string { + return p.name + "'s age is" +} + +func (p Person) GetAge() int { + return p.age +} +``` + + + +### 和函数定义的区别 + +看了上面的方法定义是不是觉得和函数定义有点类似,还记得函数的定义吗?为了唤起你的记忆,下面分别定义两个相同功能的函数,大家可以对比一下。 + +```go +func GetNameF(p Person) string { + return p.name + "'s age is" +} + +func GetNameF(p Person) int { + return p.age +} +``` + +除了定义上的区别,还有调用上的区别。下面示例代码演示了两种调用方式的不同,在`fmt.Println` 中前面 2 个是正常函数调用,后面 2 个是方法调用,就是用点号`.` 和括号`()` 的区别。 + +```go +p := Person{"lemon", 18} +fmt.Println(GetNameF(p), GetNameF(p), p.GetName(), p.GetAge()) +//输出 lemon's age is 18 lemon's age is 18 +``` + + + +### 修改接收者的值 + +上面我演示的方法 `GetName` 和`GetAge` 的接收者是` Person `值,这种值传递方式是没办法修改接收者内部状态的,比如你没法通过方法调用修改 `Person `的` name` 或`age `。 + +假设有个需求要修改用户年龄,我们像下面这样定义方法 `ageWriteable` ,调用该方法之后 `p` 的 `name` 属性并不会变化。 + +```go +func (p *Person) ageWriteable() int { + p.age += 10 + return p.age +} +``` + +那要怎么才能实现对 `p` 的修改呢? 没错用 `*Person` 指针类型即可实现修改。类比 `C++` 中用指针或引用来理解。 + +```go +func (p *Person) ageWriteable() int { + p.age += 10 + return p.age +} +``` + + + +### 隐式值与指针转换 + +Golang 非常的聪明,为了不让你麻烦,它能自动识别方法的实际接收者类型(指针或值),并默默的帮你做转换,以便「方法」能正确的工作。 + +还是用我们上面定义的方法举例,先来看以「值」作为接收者的方法调用。方便阅读,我把前面的定义再写一遍。 + +```go +func (p Person) GetName() string { + return p.name + "'s age is" +} +``` + +对于这个定义的方法,按下面的调用方式 `p `和 `pp` 都能调用 `GetName` 方法。 + +怎么做到的呢?原来 `pp` 在调用方法时 Go 默默的做了隐式的转换,其实是按照 `(*pp).GetName*()` 去调用方法,怎么实现转换的这点我们不用关心,先用起来就可以。 + +```go + p := Person{"lemon", 18} + pp := &Person{"lemon", 18} + fmt.Println(p.GetName(), pp.GetName()) // p 和 pp都能调用 GetName 方法 +``` + + + +**同理,对接收者是指针的方法,也可以按给它传递值的方式来调用,这里不再赘述。** + + + +对方法的说明,就简单介绍到这里,更多细节不去深究,留给大家在使用中学习。 + + + +## 接口 + +接口我想不到准确的描述语句来说明他,通俗来讲接口类型就是一类预先约定好的方法声明集合。 + +接口定义就是把一系列可能实现的方法先声明出来,后面只要哪个类型完全实现了某个接口声明的方法,就可用这个「接口变量」来保存这些方法的值,其实是抽象设计的概念。 + +**可以类比 `C++` 中的纯虚函数。** + +### 定义 + +为了说明接口如何定义,我们要做一些准备工作。 + +1. 先来定义两个类型,代表男人女人,他们都有属性 `name` 和 `age` + +```go +type man struct { + name string + age int +} + +type woman struct { + name string + age int +} +``` + +2. 再来分别定义两个类型的方法,`getName` 和 `getAge` 用于获取各自的姓名和年龄。 + +```go +func (m *man) getName() string { + return m.name +} + +func (m *woman) getName() string { + return m.name +} + +func (m *man) getAge() int { + return m.age +} + +func (m *woman) getAge() int { + return m.age +} +``` + +好了, 下面我们的主角「接口」登场, 我们来实现一个通用的 `humanIf` 接口类型,这个接口包含了 `getName()` 方法声明,注意接口包含的这个方法的声明样式,和前面我们定义的 `man` 与 `women` 的 `getName` 方法一致。同理 `getAge()`样式也一致。 + +```go +type humanIf interface { + getName() string + getAge() int +} +``` + +**现在可以使用这个接口了!不管男人女人反正都是人,是人就可以用我的 `humanIf` 接口获取姓名。** + +```go +var m humanIf = &man{"lemon", 18} +var w humanIf = &woman{"hanmeimei", 19} +fmt.Println(m.getName(), w.getName()) +``` + + + +### 接口类型 + +当给定一个接口值,我们如何知道他代表的底层值的具体类型呢?还是上面的例子,我们拿到了 `humanIf` 类型的变量 `m ` 和 `w`, 怎么才能知道它们到底是 `man` 还是 `women `类型呢? + +有两种方法可以确定变量 `m ` 和 `w` 的底层值类型。 + +- 类型断言 + +断言如果不是预期的类型,就会抛出 `panic `异常,程序终止。 + +如果断言是符合预期的类型,会把调用者实际的底层值返回。 + +```go +v0 := w.(man) // w保存的不是 man 类型,程序终止 + +v1 := m.(man) // m保存的符合 man 类型,v1被赋值 m 的底层值 + +v, right := a.(man) // 两个返回值,第一个是值,第二代表是否断言正确的布尔值 +fmt.Println(v, right) +``` + + + +- 类型选择 + +相比类型断言直接粗暴的让程序终止,「类型选择」语法更加的温和,即使类型不符合也不会让程序挂掉。 + +下面示例,`v3` 获得 `w` 的底层类型,在后面 `case` 通过类型比较打印出匹配的类型。注意:`type` 也是关键字。 + +```go + + switch v3 := w.(type) { + case man: + fmt.Println("it is type:man", v3) + case women: + fmt.Println("it is type:women", v3) + default: + fmt.Printf("unknow type:%T value:%v", v3, v3) + } +``` + + + +### 空接口 + +空接口 `interface{}` 代表包含了 0 个方法的接口,试想一下每个类型都至少实现了零个方法,所以任何类型都可以给空接口类型赋值。 + +下面示例,用 `man` 值给空接口赋值。 + +```go + type nilIf interface{} + var ap nilIf = &man{"lemon", 18} + + //等价定义 + var ap interface{} = &man{"lemon", 18} //等价于上面一句 +``` + +空接口可以接收任何类型的值,包括指针、值甚至是`nil` 值。 + +```go + // 接收指针 + var ap nilIf = &man{"lemon", 18} + fmt.Println("interface", ap) + // 接收值 + var a nilIf = man{"lemon", 18} + fmt.Println("interface", a) + // 接收nil值 + var b nilIf + fmt.Println("interface", b) +``` + + + +### 处理nil接口调用 + +#### nil底层值不会引发异常 + +对 C 或 C++ 程序员来说空指针是噩梦,如果对空指针做操作,结果是不可预知的,很大概率会导致程序崩溃,程序莫名其妙挂掉,想想就令人头秃。 + + ![img](https://i04piccdn.sogoucdn.com/c4ead94ec095d457) + +`Golang` 中处理空指针这种情况要优雅的多,**允许用空底层值调用接口**,但是要修改方法定义,正确处理 `nil` 值避免程序崩溃。 + +```go +func (m *man) getName() string { + if m == nil { + return "nil" + } + + return m.name +} +``` + +下面演示了使用处理了 `nil` 值的方法,虽然 `nilMan` 是空指针,但仍然可以调用 `getName` 方法。 + +```go + var nilMan *man // 定义了一个空指针 nilMan + var w humanIf = nilMan + fmt.Println(w.getName()) +``` + + + +#### nil接口引发程序异常 + +但是,如果接口本身是 `nil` 去调用方法,仍然会引发异常。 + +```go + manIf = nil + fmt.Println("interface", manIf.getName()) +``` + + + +## 总结 + +本节学习的接口和方法是 `Golang` 对面向对象程序设计的支持,可以看到实现的非常简洁,并没常用的面向对象语言那么复杂的语法和关键字,简单不代表不够好,实际上也基本够用,一句话概括就是简洁并不简单。 + +感谢各位的阅读,文章的目的是分享对知识的理解,技术类文章我都会反复求证以求最大程度保证准确性,若文中出现明显纰漏也欢迎指出,我们一起在探讨中学习。 + +今天的技术分享就到这里,我们下期再见。 + +----- + + + +**创作不易,白票不是好习惯,如果有收获,动动手指点个「在看」或给个「转发」是对我持续创作的最大支持** +