第1章 综述 1
1.1 Hello,World 1
1.2 命令行参数 4
1.3 查找重复行 8
1.4 GIF动画 13
1.5 获取一个URL 15
1.6 并发获取多个URL 17
1.7 实现一个Web服务器 19
1.8 杂项 23
第2章 程序结构 27
2.1 名字 27
2.2 声明 28
2.3 变量 30
2.4 赋值 36
2.5 类型声明 39
2.6 包和文件 41
2.7 作用域 45
第3章 基本数据类型 51
3.1 整数 51
3.2 浮点数 56
3.3 复数 61
3.4 布尔量 63
3.5 字符串 64
3.6 常量 75
第4章 复合类型 81
4.1 数组 81
4.2 切片 84
4.3 键值对 93
4.4 结构体 99
4.5 JSON 107
4.6 文本和HTML模板 113
第5章 函数 119
5.1 函数声明 119
5.2 递归 121
5.3 多返回值 124
5.4 错误 127
5.5 作为值的函数 132
5.6 匿名函数 135
5.7 变参函数 142
5.8 延后函数调用 143
5.9 崩溃 148
5.10 恢复 151
第6章 方法 155
6.1 方法声明 155
6.2 带有指针接收器的方法 158
6.3 包含嵌入结构体的复合类型 161
6.4 作为值和表达式的方法 164
6.5 示例:位向量类型 165
6.6 封装 168
第7章 接口 171
7.1 作为规约的接口 171
7.2 接口类型 174
7.3 接口约定的达成 175
7.4 使用flag.Value进行标志位分析 179
7.5 作为值的接口 181
7.6 使用sort.Interface进行排序 186
7.7 http.Handler接口 191
7.8 错误接口 196
7.9 示例:表达式评估器 197
7.10 类型断言 205
7.11 使用类型断言分辨错误 206
7.12 使用接口类型断言查询行为 208
7.13 按类型的程序分支 210
7.14 示例:基于标记符号的XML解码 213
7.15 几句建议 216
第8章 goroutine和信道 217
8.1 goroutine 217
8.2 示例:并发时钟服务器 219
8.3 示例:并发回声服务器 222
8.4 信道 225
8.5 并行循环 234
8.6 示例:并发Web爬虫 239
8.7 使用select实现多工 244
8.8 示例:并发目录遍历 247
8.9 取消执行 251
8.10 示例:聊天服务器 253
第9章 使用共享变量实现并发 257
9.1 竞险 257
9.2 互斥量:sync.Mutex 262
9.3 读写互斥量:sync.RWMutex 266
9.4 内存同步 267
9.5 缓式初始化:sync.Once 268
9.6 竞险检测器 271
9.7 示例:并发无阻塞式高速缓存 272
9.8 goroutine和线程 280
第10章 包和go工具 283
10.1 概述 283
10.2 导入路径 284
10.3 包声明 285
10.4 导入声明 285
10.5 空导入 286
10.6 包和命名 289
10.7 go工具 290
第11章 测试 301
11.1 go test工具 302
11.2 测试函数 302
11.3 覆盖率 318
11.4 性能基准函数 321
11.5 性能剖析 323
11.6 示例函数 326
第12章 反射 329
12.1 为什么会引入反射概念 329
12.2 reflect.Type和reflect.Value 330
12.3 递归值输出Display 333
12.4 示例:对S-表达式编码 338
12.5 使用reflect.Value给变量设置值 341
12.6 示例:对S-表达式解码 344
12.7 访问结构体域标签 348
12.8 列出类型的方法 351
12.9 几句忠告 352
第13章 低阶程序设计 353
13.1 unsafe.Si zeof、Alignof和Offsetof 354
13.2 unsafe.Pointer 356
13.3 示例:深等价 358
13.4 使用cgo调用C代码 361
13.5 再来几句忠告 366