第1章 Go语言简介 1
1.1 为什么要学Go语言 1
1.2 Go语言安装 1
1.3 Go语言开发工具 4
第2章 Go语言编程基础 6
2.1 数据类型 6
2.1.1 基础数据类型 6
2.1.2 复合数据类型 8
2.2 变量 9
2.2.1 变量以及声明 9
2.2.2 零值(nil) 13
2.3 常量 14
2.3.1 常量定义 14
2.3.2 iota 15
2.3.3 字面量(literal) 16
2.4 运算符 18
2.4.1 内置运算符 18
2.4.2 运算符优先级 21
2.4.3 几个特殊运算符 21
2.5 字符串 22
2.5.1 字符串介绍 22
2.5.2 字符串拼接 24
2.5.3 字符串处理 25
2.6 流程控制 26
2.6.1 switch语句 26
2.6.2 select语句 29
2.6.3 for语句 30
2.6.4 for-range结构 31
2.6.5 if语句 33
2.6.6 break语句 33
2.6.7 continue语句 34
2.6.8 标签 35
2.6.9 goto语句 35
第3章 作用域 37
3.1 关于作用域 37
3.1.1 局部变量与全局变量 37
3.1.2 显式与隐式代码块 37
3.2 约定和惯例 40
3.2.1 可见性规则 40
3.2.2 命名规范以及语法惯例 40
3.2.3 注释 41
第4章 代码结构化与项目管理 43
4.1 包(package) 43
4.1.1 包的概念 43
4.1.2 包的初始化 43
4.1.3 包的导入 44
4.1.4 标准库 45
4.1.5 从GitHub安装包 46
4.1.6 导入外部安装包 46
4.2 Go项目开发与编译 46
4.2.1 项目结构 46
4.2.2 使用Godoc 47
4.2.3 Go程序的编译 48
4.2.4 Go modules包依赖管理 49
第5章 复合数据类型 54
5.1 数组(array) 54
5.1.1 数组定义 54
5.1.2 数组声明与使用 54
5.2 切片(slice) 56
5.2.1 切片介绍 56
5.2.2 切片重组(reslice) 58
5.2.3 陈旧的切片(Stale Slices) 59
5.3 字典(map) 60
5.3.1 字典介绍 60
5.3.2 range语句中的值 61
第6章 type关键字 63
6.1 type自定义类型 63
6.2 type定义类型别名 64
第7章 错误处理与defer 66
7.1 错误处理 66
7.1.1 错误类型(error) 66
7.1.2 panic 66
7.1.3 recover 68
7.2 关于defer 68
7.2.1 defer的三个规则 68
7.2.2 使用defer计算函数执行时间 73
第8章 函数 74
8.1 函数(function) 74
8.1.1 函数介绍 74
8.1.2 函数调用 76
8.1.3 内置函数 76
8.1.4 递归与回调 80
8.1.5 匿名函数 81
8.1.6 变参函数 84
第9章 结构体和接口 86
9.1 结构体(struct) 86
9.1.1 结构体介绍 86
9.1.2 结构体特性 88
9.1.3 匿名字段 89
9.1.4 嵌入与聚合 90
9.1.5 命名冲突 93
9.2 接口(interface) 94
9.2.1 接口是什么 94
9.2.2 接口嵌入 96
9.2.3 类型断言 97
9.2.4 接口与动态类型 99
9.2.5 接口的提取 100
9.2.6 接口的继承 100
第10章 方法 101
10.1 方法的定义 101
10.1.1 接收器(receiver) 101
10.1.2 方法表达式与方法值 104
10.1.3 自定义类型方法与匿名嵌入 105
10.1.4 函数和方法的区别 108
10.2 指针方法与值方法 108
10.2.1 指针方法与值方法的区别 108
10.2.2 接口变量上的指针方法与值方法 111
10.2.3 指针接收器和值接收器的选择 114
10.3 匿名类型的方法提升 114
10.3.1 匿名类型的方法调用 114
10.3.2 方法提升规则 115
第11章 面向对象与内存 118
11.1 面向对象 118
11.1.1 Go语言中的面向对象 118
11.1.2 多重继承 119
11.2 指针和内存 119
11.2.1 指针 119
11.2.2 new()和make()的区别 121
11.2.3 垃圾回收 121
第12章 并发处理 124
12.1 协程 124
12.1.1 协程与并发 124
12.1.2 协程使用 127
12.2 通道(channel) 127
12.3 同步与锁 131
12.3.1 互斥锁 132
12.3.2 读写锁 135
12.3.3 sync.WaitGroup 136
12.3.4 sync.Once 137
12.3.5 sync.Map 138
第13章 测试与调优 140
13.1 测试 140
13.1.1 单元测试 140
13.1.2 基准测试 141
13.2 调优 142
13.2.1 分析Go程序 142
13.2.2 用pprof调试 143
第14章 系统标准库 148
14.1 reflect包 148
14.1.1 反射(reflect) 148
14.1.2 反射的应用 150
14.2 unsafe包 155
14.2.1 unsafe包介绍 155
14.2.2 指针运算 156
14.3 sort包 160
14.3.1 sort包介绍 160
14.3.2 自定义sort.Interface排序 163
14.3.3 sort.Slice排序 164
14.4 os包 164
14.4.1 启动外部命令和程序 164
14.4.2 os/signal信号处理 166
14.5 fmt包 167
14.5.1 格式化I/O 167
14.5.2 格式化输出 169
14.6 flag包 174
14.6.1 命令行 174
14.6.2 参数解析 174
14.7 文件操作与I/O 177
14.7.1 文件操作 177
14.7.2 I/O读写 178
14.7.3 ioutil包读写 181
14.7.4 bufio包读写 182
14.7.5 log包日志操作 184
第15章 网络服务 186
15.1 Socket 186
15.1.1 Socket基础知识 186
15.1.2 TCP与UDP 186
15.2 模板(Template) 189
15.2.1 text/template包 189
15.2.2 html/template包 191
15.2.3 模板语法 194
15.3 net/http包 196
15.3.1 http Request 197
15.3.2 http Response 199
15.3.3 http Client 200
15.3.4 http Server 205
15.3.5 自定义类型Handler 210
15.3.6 将函数直接作为Handler 212
15.3.7 中间件 212
15.3.8 搭建静态站点 213
15.4 context包 214
15.4.1 context包介绍 214
15.4.2 上下文应用 216
第16章 数据格式与存储 221
16.1 数据格式 221
16.1.1 序列化与反序列化 221
16.1.2 JSON数据格式 221
16.1.3 将JSON数据反序列化到结构体 222
16.1.4 反序列化任意JSON数据 224
16.1.5 JSON数据编码和解码 225
16.1.6 JSON数据延迟解析 227
16.1.7 Protocol Buffer数据格式 228
16.2 MySQL数据库 231
16.2.1 database/sql包 231
16.2.2 MySQL数据库操作 231
16.3 LevelDB与BoltDB数据库 236
16.3.1 LevelDB数据库操作 237
16.3.2 BoltDB数据库操作 240
第17章 网络爬虫 244
17.1 Colly网络爬虫框架 244
17.2 goquery HTML解析 246
第18章 Web框架——Gin 250
18.1 关于Gin 250
18.2 Gin实际应用 251
18.2.1 静态资源站点 251
18.2.2 构建动态站点 252
18.2.3 中间件的使用 256
18.2.4 RESTful API接口 256
参考文献 260