前言 学习Go语言,抓住未来的机遇
●部分 快速入门Go语言
第1章 基础入门:Hello, Go语言 2
1.1 Hello,World 2
1.2 程序结构分析 3
1.3 搭建Go语言开发环境 4
1.3.1 在Windows下安装 4
1.3.2 在Linux下安装 4
1.3.3 在macOS下安装 4
1.3.4 安装测试 4
1.3.5 环境变量设置 5
1.4 项目结构 5
1.5 编译发布 6
1.6 跨平台编译 6
1.7 Go编辑器推荐 7
1.8 小结 8
第2章 数据类型:Go语言的基石 9
2.1 一个简单示例 9
2.2 基础类型 11
2.2.1 整型 11
2.2.2 浮点型 11
2.2.3 布尔型 12
2.2.4 字符串 12
2.2.5 零值 12
2.3 变量 13
2.3.1 变量简短声明 13
2.3.2 指针 13
2.3.3 赋值 13
2.4 常量 14
2.4.1 常量的定义 14
2.4.2 iota 14
2.5 字符串的使用 15
2.5.1 字符串和数字互转 15
2.5.2 strings包 16
2.6 小结 16
第3章
控制结构:if、for、switch那些事儿 17
3.1 if条件语句 17
3.2 switch选择语句 19
3.3 for循环语句 20
3.4 小结 22
第4章
集合类型:如何正确使用array、slice和map 23
4.1 数组 24
4.1.1 数组声明 24
4.1.2 数组循环 25
4.2 切片 25
4.2.1 基于数组生成切片 26
4.2.2 切片的修改 26
4.2.3 切片的声明 27
4.2.4 append函数 27
4.2.5 切片元素循环 28
4.3 映射 28
4.3.1 创建和初始化map 28
4.3.2 获取和删除map 29
4.3.3 遍历map 29
4.3.4 获取map的大小 30
4.4 string和[]byte 30
4.5 小结 31
第5章
函数和方法:如何区分函数和方法 32
5.1 函数 33
5.1.1 函数初探 33
5.1.2 函数声明 33
5.1.3 多值返回 34
5.1.4 返回值命名 35
5.1.5 可变参数 36
5.1.6 包级函数 37
5.1.7 匿名函数和闭包 37
5.2 方法 39
5.2.1 不同于函数的方法 39
5.2.2 值和指针类型接收者 39
5.3 小结 40
第6章
struct和interface:隐式的接口实现 42
6.1 结构体 43
6.1.1 结构体的定义 43
6.1.2 声明和使用 44
6.1.3 结构体的字段 44
6.2 接口 45
6.2.1 接口的定义 45
6.2.2 接口的实现 46
6.2.3 值和指针类型接收者 47
6.3 工厂函数 48
6.4 继承和组合 49
6.5 类型断言 50
6.6 小结 52
第7章
错误处理:如何更优雅地处理程序异常和错误 53
7.1 错误 54
7.1.1 error接口 54
7.1.2 error工厂函数 55
7.1.3 自定义error 55
7.1.4 error断言 56
7.2 错误嵌套 56
7.2.1 Error Wrapping功能 56
7.2.2 errors.Unwrap函数 57
7.2.3 errors.Is函数 57
7.2.4 errors.As函数 58
7.3 defer函数 58
7.4 panic函数 59
7.5 recover函数 60
7.6 小结 60
●第二部分 Go语言的高效并发
第8章
goroutine和channel:并发的基础 62
8.1 什么是并发 63
8.2 进程和线程 63
8.2.1 进程 63
8.2.2 线程 64
8.3 协程 64
8.4 管道 65
8.4.1 声明一个管道 65
8.4.2 无缓冲管道 66
8.4.3 有缓冲管道 66
8.4.4 关闭管道 67
8.4.5 单向管道 67
8.5 select channel示例 68
8.6 小结 69
第9章
同步原语:让你对并发控制得心应手 70
9.1 资源竞争 70
9.2 同步原语 71
9.2.1 sync.Mutex 71
9.2.2 sync.RWMutex 72
9.2.3 sync.WaitGroup 73
9.2.4 sync.Once 75
9.2.5 sync.Cond 76
9.3 小结 77
第10章
Context:多协程并发控制神器 79
10.1 协程如何退出 79
10.2 Context的使用示例 81
10.3 Context详解 82
10.4 Context树 83
10.5 使用Context取消多个协程 84
10.6 Context传值 85
10.7 Context使用原则 85
10.8 小结 86
第11章
并发模式:拿来即用的经验总结 87
11.1 for select循环模式 87
11.2 select timeout模式 88
11.3 流水线模式 89
11.4 扇出和扇入模式 92
11.5 Future模式 94
11.6 小结 96
第12章
并发技巧:高效并发安全的字节池 97
12.1 字节切片 97
12.2 高效字节池 98
12.3 使用BytePoolCap 99
12.4
BytePoolCap与sync.Pool的
对比 99
12.5 小结 101
●第三部分 深入理解Go语言
第13章
指针详解:什么情况下应该使用指针 104
13.1 什么是指针 104
13.2 指针的声明和定义 105
13.3 指针的操作 107
13.4 指针参数 107
13.5 指针接收者 108
13.6 什么情况下使用指针 108
13.7 小结 109
第14章
参数传递:值、引用以及指针的区别 110
14.1 修改参数 111
14.2 值类型 112
14.3 指针类型 113
14.4 引用类型 114
14.4.1 map 114
14.4.2 chan 116
14.5 类型的零值 116
14.6 小结 117
第15章
内存分配:new和make该如何选择 118
15.1 变量 118
15.1.1 变量的声明 119
15.1.2 变量的赋值 119
15.2 new函数 120
15.3 变量初始化 121
15.3.1 指针变量初始化 122
15.