学习 Go 语言
作者:
Miek Gieben
译者:
邢星
感谢:
Go
作者
,Google
下朋友提供了帮助和贡献:
(按字母顺序)
Adam J. Gray,Alex Sychev,Alexey Chernenkov,Andrea Spadaccini,Andrey Mirtchovski,
Anthony Magro,Babu Sreekanth,Ben Bullock,Bob Cunningham,Brian Fallik,Cecil
New,Damian Gryski,Dan Kortschak,David Otton,Fabian Becker,Filip Zaludek,Hadi
Amiri,Haiping Fan,Jaap Akkerhuis,JC van Winkel,Jeroen Bulten,Jinpu Hu,John
Shahid,Jonathan Kans,Joshua Stein,Makoto Inoue,Mayuresh Kathe,“mem”,Michael
Stapelberg,Olexandr Shalakhin,Paulo Pinto,Peter Kleiweg,Philipp Schmidt,Robert
Johnson,Russel Winder,Sonia Keys,Stefan Schroeder,Thomas Kapplet,T.J. Yang,
“Cobold”,“Simoc”,“Uriel”†,
邢星
。 还有来自以下朋友的小帮助:
Alexander Katasonov, Daniele Pala, Iaroslav Tymchenko, Nicolas Kaiser, Marco Ynema.
This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License.
Miek Gieben – ©2010 - 2012
邢星
– ©2011 - 2013
Contents
读者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
1 简介 1
官方文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
编译和运行代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
本书使用的设置 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
变量、类型和关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
运算符和内建函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Go 关键字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
控制结构 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
内建函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
array、slices 和 map . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
2 函数 26
作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
多值返回 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
命名返回值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
延迟代码 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
变参 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
函数作为值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
回调 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
恐慌(Panic)和恢复(Recover) . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
3 包 44
标识符 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
包的文档 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
测试包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
常用的包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
4 进阶 54
内存分配 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
定义自己的类型 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
转换 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
组合 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
ii
Chapter: Contents
5 接口 70
方法 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
接口名字 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
简短的例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
6 并发 82
更多关于 channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
7 通讯 90
io.Reader . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
一些例子 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
命令行参数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
执行命令 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
网络 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
练习 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
答案 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
A 版权 106
贡献者 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
许可证和版权 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
B 索引 108
C Bibliography 110
List of Exercises
1 (0) For-loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
2 (0) FizzBuzz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3 (1) 字符串 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 (1) 平均值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5 (0) 平均值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6 (0) 整数顺序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
7 (1) 作用域 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8 (1) 栈 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
9 (1) 变参 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
10 (1) 斐波那契 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
11 (1) map 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
12 (0) 最小值和最大值 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
13 (1) 冒泡排序 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
14 (1) 函数返回一个函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
15 (0) stack 包 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
16 (2) 计算器 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
List of Exercises
iii
17 (1) 指针运算 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
18 (2) 使用 interface 的 map 函数 . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
19 (1) 指针 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
20 (1) Linked List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
21 (1) Cat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
22 (2) 方法调用 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
23 (1) 接口和编译 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
24 (1) 指针和反射 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
25 (2) 接口和 max() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
26 (1) Channel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
27 (2) 斐波那契 II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
28 (2) 进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
29 (0) 单词和字母统计 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
30 (0) Uniq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
31 (2) Quine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
32 (1) Echo 服务 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
33 (2) 数字游戏 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
34 (1) *Finger 守护进程 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96