Go作为一门广受关注的热门语言,在市场上从来不缺少相关的书,特别是面向初学者的书。然而,跟市面上很多声称是入门书却只会一股脑儿地将各种语言细节硬塞给读者的“伪入门书”不一样,本书是一本真正面向初学者的书。整本书的学习曲线非常平缓,不会像过山车那样忽高忽低。书中的内容首先从变量、循环、分支、类型等基础知识开始,逐渐进阶至函数、方法、收集器和结构,最后再深入到指针、错误处理和并发等高级特性。只要翻开本书一页页读下去,你就会循序渐进地学到越来越多Go语言的知识,并且逐步掌握Go语言的众多特性。
除上面提到的优点之外,本书还是一本非常有趣的书。作者在书中列举了大量跟天文以及航天有关的例子,读者不仅要计算从地球乘坐宇宙飞船航行至火星所需的天数,还要在火星上放置探测器以便查找生命存在的痕迹,甚至还要想办法改造火星,使它能够适宜人类居住。值得一提的是,书中很多地方都带有可爱的地鼠(gopher)插图,它们就像旅行途中优美的景色一样,将为我们的学习旅途增添大量的乐趣。
总而言之,这是一本既有趣又实用的Go语言入门书。如果你只想读一本关于Go语言的入门书,那么我强烈推荐你读这一本《Go语言趣学指南》。
遗憾的是,很多学习Go语言的资源都假设读者拥有C语言的工作经验,而本书的目的则在于弥补这一缺陷,为脚本使用者、业余爱好者和初学者提供一条学习Go语言的康庄大道。为了让起步的过程变得更容易一些,本书的所有代码清单和练习都可以在Go Playground里面执行,你在阅读本书的时候甚至不需要安装任何东西。
如果你曾经使用过诸如JavaScript、Lua、PHP、Perl、Python或者Ruby这样的脚本语言,那么你已经做好了学习Go的万全准备。如果你曾经使用过Scratch或者Excel的公式,或者编写过HTML,那么你毫无疑问可以像Audrey Lim在她的演讲“A Beginner’s Mind”(初学者之心)中所说的一样,选择Go作为你的第一门“真正”的编程语言。虽然掌握Go语言并不是一件容易的事情,需要相应的耐心和努力,但我们希望本书在这个过程中能够助你一臂之力。
内容提要
《Go语言趣学指南》是一本面向Go语言初学者的书,循序渐进地介绍了使用Go语言所必需的知识,展示了非常多生动有趣的例子,并通过提供大量练习来加深读者对书中所述内容的理解。本书共分8个单元,分别介绍变量、常量、分支和循环等基础语句,整数、浮点数和字符串等常用类型,类型、函数和方法,数组、切片和映射,结构和接口,指针、nil和错误处理方法,并发和状态保护,并且每个单元都包含相应的章节和单元测试。
本书适合对初学Go语言有不同需求的程序员阅读。无论是刚开始学习Go语言的新手,还是想要回顾Go语言基础知识的Go语言使用者,只要是想用Go做开发,无论是开发小型脚本还是大型程序,本书都会非常有帮助。
作者简介
NATHAN YOUNGMAN (内森·扬曼)既是一位自学成才的网络开发者,也是终生学习概念的一位践行者。 他是加拿大埃德蒙顿市 Go 聚会的组织者,Canada Learning Code 机构的导师以及地鼠玩偶的狂热摄影爱好者。
ROGER PEPPÉ (罗杰·佩珀)是一位 Go 贡献者,他维护着一系列开源 Go 项目,运营着英国纽卡斯尔市的 Go 聚会,并且当前正在担任 Go 云端基础设施软件的相关工作。
目录结构
第0单元 入门
第 1章 各就各位,预备,Go! 3
1.1 什么是Go 4
1.2 Go Playground 6
1.3 包和函数 7
1.4 唯一允许的大括号放置风格 8
1.5 小结 9
实验:playground.go 10
第 1单元 命令式编程
第 2章 被美化的计算器 13
2.1 执行计算 13
2.2 格式化输出 15
2.3 常量和变量 16
2.4 走捷径 18
2.4.1 一次声明多个变量 18
2.4.2 增量并赋值操作符 18
2.5 数字游戏 19
2.6 小结 20
实验:malacandra.go 21
第3章 循环和分支 22
3.1 真或假 23
3.2 比较 24
3.3 使用if实现分支判断 25
3.4 逻辑运算符 26
3.5 使用switch实现分支判断 28
3.6 使用循环实现重复执行 30
3.7 小结 31
实验:guess.go 32
第4章 变量作用域 33
4.1 审视作用域 34
4.2 简短声明 35
4.3 作用域的范围 37
4.4 小结 39
实验:random-dates.go 39
第5章 单元实验:前往火星的航行票 40
第 2单元 类型
第6章 实数 45
6.1 声明浮点类型变量 46
6.1.1 单精度浮点数 47
6.1.2 零值 47
6.2 打印浮点类型 48
6.3 浮点精确性 49
6.4 比较浮点数 51
6.5 小结 51
实验:piggy.go 52
第7章 整数 53
7.1 声明整数类型变量 54
7.1.1 为不同场合而设的整数类型 54
7.1.2 了解类型 56
7.2 为8位颜色使用uint8类型 56
7.3 整数回绕 58
7.3.1 聚焦二进制位 58
7.3.2 避免时间回绕 60
7.4 小结 61
实验:piggy.go 62
第8章 大数 63
8.1 击中天花板 63
8.2 big包 65
8.3 大小非同寻常的常量 66
8.4 小结 68
实验:cains.go 68
第9章 多语言文本 69
9.1 声明字符串变量 70
9.2 字符、代码点、符文和字节 71
9.3 拉弦 73
9.4 使用凯撒加密法处理字符 73
9.5 将字符串解码为符文 76
9.6 小结 77
实验:caesar.go 78
实验:international.go 78
第 10章 类型转换 79
10.1 类型不能混合使用 79
10.2 数字类型转换 81
10.3 类型转换的危险之处 82
10.4 字符串转换 83
10.5 转换布尔值 85
10.6 小结 86
实验:input.go 86
第 11章 单元实验:维吉尼亚加密法 87
实验:decipher.go 88
实验:cipher.go 89
第3单元 构建块
第 12章 函数 93
12.1 函数声明 94
12.2 编写函数 97
12.3 小结 99
实验:functions.go 99
第 13章 方法 100
13.1 声明新类型 101
13.2 引入自定义类型 102
13.3 通过方法为类型添加行为 103
13.4 小结 105
实验:methods.go 106
第 14章 一等函数 107
14.1 将函数赋值给变量 108
14.2 将函数传递给其他函数 109
14.3 声明函数类型 110
14.4 闭包和匿名函数 111
14.5 小结 113
实验:calibrate.go 114
第 15章 单元实验:温度表 115
第4单元 收集器
第 16章 劳苦功高的数组 119
16.1 声明数组并访问其元素 119
16.2 小心越界 121
16.3 使用复合字面量初始化数组 121
16.4 迭代数组 122
16.5 数组被复制 123
16.6 由数组组成的数组 125
16.7 小结 125
实验:chess.go 126
第 17章 切片:指向数组的窗口 127
17.1 切分数组 128
17.2 切片的复合字面量 130
17.3 切片的威力 130
17.4 带有方法的切片 132
17.5 小结 133
实验:terraform.go 133
第 18章 更大的切片 134
18.1 append函数 134
18.2 长度和容量 135
18.3 详解append函数 136
18.4 三索引切分操作 137
18.5 使用make函数对切片实行预分配 138
18.6 声明可变参数函数 139
18.7 小结 140
实验:capacity.go 140
第 19章 无所不能的映射 141
19.1 声明映射 142
19.2 映射不会被复制 143
19.3 使用make函数对映射实行预分配 144
19.4 使用映射进行计数 145
19.5 使用映射和切片实现数据分组 146
19.6 将映射用作集合 147
19.7 小结 148
实验:words.go 148
第 20章 单元实验:切片人生 150
20.1 开天辟地 150
20.1.1 观察世界 151
20.1.2 激活细胞 151
20.2 适者生存 152
20.2.1 存活还是死亡 152
20.2.2 统计邻近细胞 152
20.2.3 游戏逻辑 153
20.3 平行世界 153
第5单元 状态与行为
第 21章 结构 157
21.1 声明结构 157
21.2 通过类型复用结构 159
21.3 通过复合字面量初始化结构 159
21.4 结构被复制 161
21.5 由结构组成的切片 161
21.6 将结构编码为JSON 162
21.7 使用结构标签定制JSON 164
21.8 小结 165
实验:landing.go 165
第 22章 Go没有类 166
22.1 将方法绑定到结构 166
22.2 构造函数 168
22.3 类的替代品 169
22.4 小结 171
实验:landing.go 171
实验:distance.go 171
第 23章 组合与转发 173
23.1 合并结构 174
23.2 实现自动的转发方法 176
23.3 命名冲突 178
23.4 小结 180
实验:gps.go 180
第 24章 接口 181
24.1 接口类型 182
24.2 探索接口 185
24.3 满足接口 187
24.4 小结 189
实验:marshal.go 189
第 25章 单元实验:火星上的动物避难所 190
第6单元 深入Go语言
第 26章 关于指针的二三事 195
26.1 &和* 196
26.2 指针的作用就是指向 199
26.2.1 指向结构的指针 201
26.2.2 指向数组的指针 202
26.3 实现修改 203
26.3.1 将指针用作形参 203
26.3.2 指针接收者 204
26.3.3 内部指针 206
26.3.4 修改数组 207
26.4 隐式指针 208
26.4.1 映射也是指针 208
26.4.2 切片指向数组 208
26.5 指针和接口 209
26.6 明智地使用指针 210
26.7 小结 211
实验:turtle.go 211
第 27章 关于nil的纷纷扰扰 212
27.1 通向惊恐的nil指针 213
27.2 保护你的方法 214
27.3 nil函数值 216
27.4 nil切片 217
27.5 nil映射 218
27.6 nil接口 218
27.7 nil之外的另一个选择 219
27.8 小结 220
实验:knights.go 221
第 28章 孰能无过 222
28.1 处理错误 223
28.2 优雅的错误处理 224
28.2.1 文件写入 225
28.2.2 关键字defer 227
28.2.3 创造性的错误处理 228
28.3 新的错误 229
28.3.1 按需返回错误 231
28.3.2 自定义错误类型 232
28.4 不要惊恐 235
28.4.1 其他语言中的异常 235
28.4.2 如何引发惊恐 236
28.4.3 处理惊恐 237
28.5 小结 237
实验:url.go 238
第 29章 单元实验:数独规则 239
第7单元 并发编程
第30章 goroutine和并发 243
30.1 启动goroutine 244
30.2 不止一个goroutine 245
30.3 通道 247
30.4 使用select处理多个通道 249
30.5 阻塞和死锁 251
30.6 地鼠装配线 252
30.7 小结 256
实验:remove-identical.go 256
实验:split-words.go 256
第31章 并发状态 257
31.1 互斥锁 258
31.2 长时间运行的工作进程 262
31.3 小结 267
实验:positionworker.go 268
实验:rover.go 268
第32章 单元实验:寻找火星生命 269
32.1 可供活动的网格 269
32.2 报告发现 270
结语:何去何从 273
习题答案(网上下载)
未覆盖内容
Go是一门相对小型的语言,你已经学习了它的大部分知识,但还有一些知识是本书没有涉及的。
- 没有介绍使用方便的iota标识符来声明连续的常量。
- 没有介绍移位操作符(<<和>>)和位运算操作符(&和|)。
- 第3章介绍了循环,但没有介绍关键字continue并且跳过了关键字goto和标签。
- 第4章介绍了作用域但没有说明遮蔽变量的具体规则。
- 第6章至第8章介绍了浮点数、整数和大数字,但没有介绍复数和虚数。
- 第12章介绍了关键字return,但没有介绍裸返回(bare return)。
- 第12章介绍了空接口interface{},但只是浅尝即止。
- 第13章介绍了方法但没有介绍方法值。
- 第28章介绍了类型断言但没有介绍类型判断。
- 第30章没有介绍双向通道。
- 没有介绍执行初始化操作的init函数,它和main函数一样都是特殊函数。
- 没有详细地介绍每个内置函数,例如,分配内存并返回指针的new函数和复制切片的copy函数(详见Go官方标准库网站)。
- 没有演示通过编写新包来组织代码,也没有说明如何将自己的包分享给别人。
最后分享几张书内萌图,你也可以给他们配上一句文字。祝您阅读愉快!
来源:oschina
链接:https://my.oschina.net/u/4270506/blog/3234717