资源说明:个人学习golang笔记,从各种教程中总结而来,作为入门参考。目录如下
目录
1. 入门 1
1.1. Hello world 1
1.2. 命令行参数 2
2. 程序结构 3
2.1. 类型 4
2.1.1. 命名类型(named type)与未命名类型(unamed type) 4
2.1.2. 基础类型(underlying type) 4
2.1.3. 可赋值性 5
2.1.4. 类型方法集 6
2.1.5. 类型声明 6
2.2. 变量 8
2.2.1. 变量声明 8
2.2.2. 类型零值 12
2.2.3. 指针 13
2.3. 赋值 17
2.4. 包和文件 17
2.5. 作用域 18
2.6. 语句 19
2.7. 比较运算符 20
2.8. 类型转换 21
2.9. 控制流 23
2.9.1. If 23
2.9.2. Goto 24
2.9.3. For 25
2.9.4. Switch 25
2.9.5. break语句 31
2.9.6. Continue语句 31
3. 基础数据类型 31
3.1. golang类型 31
3.2. Numeric types 32
3.3. 字符串 33
3.3.1. 什么是字符串 33
3.3.2. 字符串底层概念 35
3.3.3. 获取每个字节 38
3.3.4. Rune 39
3.3.5. 字符串的 for range 循环 40
3.3.6. 用字节切片构造字符串 41
3.3.7. 用rune切片构造字符串 42
3.3.8. 字符串的长度 42
3.3.9. 字符串是不可变的 42
3.3.10. UTF8(go圣经) 43
3.4. 常量 45
3.4.1. 常量定义 45
3.4.2. 常量类型 46
3.4.3. Iota 46
4. 组合数据类型 47
4.1. 数组 47
4.1.1. 数组概述 47
4.1.2. 数组的声明 49
4.1.3. 数组的长度 50
4.1.4. 遍历数组 50
4.1.5. 多维数组 51
4.2. 切片 52
4.2.1. 什么是切片 52
4.2.2. 切片概述 55
4.2.3. 创建一个切片 55
4.2.4. 切片遍历 57
4.2.5. 切片的修改 58
4.2.6. 切片的长度和容量 60
4.2.7. 追加切片元素 62
4.2.8. 切片的函数传递 65
4.2.9. 多维切片 66
4.2.10. 内存优化 67
4.2.11. nil slice和empty slice 69
4.2.12. For range 70
4.3. 结构 71
4.3.1. 什么是结构体? 71
4.3.2. 结构体声明 73
4.3.3. 结构体初始化 77
4.3.4. 嵌套结构体(Nested Structs) 81
4.3.5. 匿名字段 82
4.3.6. 导出结构体和字段 84
4.3.7. 结构体相等性(Structs Equality) 85
4.4. 指针类型 86
4.5. 函数 87
4.6. map 87
4.6.1. 什么是map 87
4.6.2. 声明、初始化和make 89
4.6.3. 给 map 添加元素 91
4.6.4. 获取 map 中的元素 91
4.6.5. 删除 map 中的元素 92
4.6.6. 获取 map 的长度 92
4.6.7. Map 的相等性 92
4.6.8. map的排序 92
4.7. 接口 93
4.7.1. 什么是接口? 93
4.7.2. 接口的声明与实现 96
4.7.3. 接口的实际用途 97
4.7.4. 接口的内部表示 99
4.7.5. 空接口 102
4.7.6. 类型断言 105
4.7.7. 类型选择(Type Switch) 109
4.7.8. 实现接口:指针接受者与值接受者 112
4.7.9. 实现多个接口 114
4.7.10. 接口的嵌套 116
4.7.11. 接口的零值 119
4.8. Channel 120
4.9. 类型转换 120
5. 函数 120
5.1. 函数的声明 121
5.2. 一个递归函数的例子( recursive functions) 121
5.3. 多返回值 121
5.4. 命名返回值 121
5.5. 可变函数参数 122
5.6. Defer 123
5.6.1. Defer语句介绍 123
5.6.2. Defer使用场景 128
5.7. 什么是头等(第一类)函数? 130
5.8. 匿名函数 130
5.9. 用户自定义的函数类型 132
5.10. 高阶函数(装饰器?) 133
5.10.1. 把函数作为参数,传递给其它函数 134
5.10.2. 在其它函数中返回函数 134
5.11. 闭包 135
5.12. 头等函数的实际用途 137
6. 微服务创建 140
6.1. 使用net/http创建简单的web server 140
6.2. 读写JSON 144
6.2.1. Marshal go结构到JSON 144
6.2.2. Unmarshalling JSON 到Go结构 146
7. 方法 146
7.1. 什么是方法? 146
7.2. 方法示例 146
7.3. 函数和方法区别 148
7.4. 指针接收器与值接收器 153
7.5. 那么什么时候使用指针接收器,什么时候使用值接收器? 155
7.6. 匿名字段的方法 156
7.7. 在方法中使用值接收器 与 在函数中使用值参数 157
7.8. 在方法中使用指针接收器 与 在函数中使用指针参数 159
7.9. 在非结构体上的方法 161
8. 并发入门 162
8.1. 并发是什么? 162
8.2. 并行是什么? 162
8.3. 从技术上看并发和并行 163
8.4. Go 对并发的支持 164
9. Go 协程 164
9.1. Go 协程是什么? 164
9.2. Go 协程相比于线程的优势 164
9.3. 如何启动一个 Go 协程? 165
9.4. 启动多个 Go 协程 167
10. 信道channel 169
10.1. 什么是信道? 169
10.2. 信道的声明 169
10.3. 通过信道进行发送和接收 169
10.4. 发送与接收默认是阻塞的 170
10.5. 信道的代码示例 170
10.6. 信道的另一个示例 173
10.7. 死锁 174
10.8. 单向信道 175
10.9. 关闭信道和使用 for range 遍历信道 176
11. 缓冲信道和工作池(Buffered Channels and Worker Pools) 179
11.1. 什么是缓冲信道? 179
11.2. 死锁 182
11.3. 长度 vs 容量 183
11.4. WaitGroup 184
11.5. 工作池的实现 186
12. Select 188
12.1. 什么是 select? 188
12.2. 示例 189
12.3. select 的应用 190
12.4. 默认情况 190
12.5. 死锁与默认情况 191
12.6. 随机选取 191
12.7. 这下我懂了:空 select 191
13. 文件读写 191
13.1. GoLang几种读文件方式的比较 197
14. 个人 197
14.1. ++,-- 198
14.2. 逗号 198
14.3. 未使用的变量 199
14.4. Effective go 199
14.4.1. 指针 vs. 值 199
14.5. 可寻址性-map和slice的区别 201
14.5.1. slice 201
14.5.2. map 202
14.6. golang库 203
14.6.1. unicode/utf8包 203
14.6.2. time包 205
14.6.3. Strings包 205
14.6.4. 输入输出 212
14.6.5. 正则处理 224
14.6.6. Golang内建函数 226
Go 语言学习笔记
Go 语言,又称为 Golang,是一种静态类型的编程语言,由 Google 的 Robert Griesemer、Rob Pike 和 Ken Thompson 设计。它以其简洁、高效和并发支持而受到广泛欢迎。本笔记主要涵盖了 Go 语言的基础知识,包括入门、程序结构、数据类型、控制流以及高级特性。
1. 入门
- Hello World:Go 语言的源代码文件通常以 `.go` 结尾,使用 `go run` 命令编译并运行。例如,`go run main.go` 将运行名为 `main.go` 的源文件。
- 命令行参数:可以通过 `os.Args` 获取命令行参数,它是一个字符串切片,其中第一个元素是程序名称,其余是传入的参数。
2. 程序结构
- 类型:Go 语言中有命名类型和未命名类型,它们都有基础类型。类型方法集定义了类型可以拥有的方法。
- 变量:声明变量使用 `var` 关键字,类型零值是变量未初始化时的默认值。指针变量存储的是变量的地址。
- 赋值:Go 语言支持简单的赋值操作,以及复合赋值,如 +=、-= 等。
- 包和文件:每个源文件都属于一个包,包内可以包含多个文件,包间通过导入(import)来引用其他包。
- 作用域:变量的作用域取决于其声明的位置,包括包级作用域和函数作用域。
- 语句:包括条件语句(if)、无条件跳转(goto)、循环(for、while-like for)、switch 以及 break 和 continue 语句。
3. 数据类型
- 基础数据类型:包括整型(Numeric types)、浮点型、布尔型、字符串等。
- 字符串:字符串是不可变的,由字节(bytes)组成,可以用 for range 进行遍历。Rune 代表 Unicode 码点。
- 常量:使用 `const` 关键字定义,可以指定类型或通过 iota 进行枚举。
4. 组合数据类型
- 数组:具有固定长度的相同类型元素序列,可通过索引访问。
- 切片:动态大小的数据结构,基于数组,支持增加、删除元素。
- 结构体:组合不同类型数据的复合类型,可以有嵌套结构体和匿名字段。
- 指针类型:指向变量内存地址的类型,允许间接访问和修改变量。
- 函数:可以作为参数传递和返回的高阶函数,支持多返回值和命名返回值。
- map:关联键(key)和值(value)的数据结构,支持添加、删除和查找操作。
- 接口:定义一组方法签名,实现了接口的类型可以满足接口要求。
- Channel:用于并发编程,支持数据的发送和接收,实现 goroutine 间的通信。
5. 并发编程
- Goroutine:轻量级线程,Go 语言中的并发原语,使用 `go` 关键字启动。
- Channel:用于 goroutine 间的同步和通信,可以是无缓冲或有缓冲的,避免死锁。
- Select:用于等待多个通道操作,选择最先完成的操作执行。
6. 高级特性
- 类型转换:在必要时将一个类型转换为另一个类型。
- 方法:在类型上定义函数,支持值接收者和指针接收者。
- 接口:实现接口可以实现多态,接口的零值是 nil。
- 头等函数:函数可以作为其他函数的参数,或者作为其他函数的返回值。
- 匿名函数和闭包:可以定义没有名字的函数,闭包可以捕获其作用域内的变量。
- 文件读写:Go 语言提供了方便的文件操作接口,支持多种读写模式。
本笔记覆盖了 Go 语言的大部分基础知识,从简单的 HelloWorld 示例到复杂的并发编程,为初学者提供了一个全面的入门指南。通过深入理解和实践这些知识点,开发者可以有效地编写和维护 Go 语言应用程序。
本源码包内暂不包含可直接显示的源代码文件,请下载源码包。