本书的组织

我们假设你有一个或多个其他编程语言的使用经历, 不过是类似 C、c++,和Java 的编译型语言, 还是类似 Python, Ruby, JavaScript 的脚本语言, 因此我们不会相对完全的编程语言初学者那样解释所有的细节. 因为Go的语言的 变量,常量,表达式,控制流和函数等语法也是类似的.

第一章包含了Go教程的基本结构, 通过十几个程序介绍了用Go如何实现 类似读写文件, 文本格式化, 创建图像, 网络客户端和服务器通讯 等日常工作.

第二章描述了一个Go程序的基本元素结构, 变量, 定义新的类型, 包和文件, 和作用域. 第三章讨论了数字, 布尔值, 字符串和常量, 并演示了如何显示和处理Unicode. 第四章描述了复合类型, 从简单的数组, 字典, 切片, 到动态列表. 第五章涵盖了函数, 并讨论了错误处理, panic 和 recover, 和 defer 语句.

第三章讨论了数字、布尔值、字符串和常数,并解释显示处理Unicode。 第四章描述了复合类型,类型建立使用数组,从简单的地图,结构,和切割的方法去动态列表。第五章涵盖了函数和讨论错误处理,恐慌和恢复,而推迟的陈述。

第一章到第五章是基础部分, 任何主流命令式语言的一部分都是类似的. 虽然有时候Go的语法和风格会有自己的特色, 但是大多数程序员将很快适应. 剩下的章节是Go中特有的部分: 方法, 接口, 并发, 包, 测试和反射等.

Go的面向对象是不同寻常的. 它没有类层次结构, 甚至没有类; 仅仅是通过组合(而不是继承)简单的对象来构建复杂的对象. 方法不仅仅可以定义在结构体上, 而是可以在任何用户自己定义的类型上; 并且具体类型和抽象类型(接口)之间的关系是隐式的, 所以很多类型的设计者可能并不知道该类型到底满足了哪些接口. 方法在第六章讨论, 接口在第七章将讨论.

第八章讨论了基于顺序通信进程(CSP)的概念的并发编程, 使用 goroutines 和 channels. 第九章讨论了更为传统的基于共享变量的并发性.

第十章描述了包机制, 包的组织结构. 本章还展示了如何利用有效的利用Go自带的工具, 通过一个命令提供了编译, 测试, 基准测试, 代码格式化, 文档, 和许多其他任务.

第十一章讨论单元测试, Go的工具和标准库中集成了轻量级的测试功能, 从而避免了采用复杂强大的测试框架. 测试库提供一些基本的构建, 如果有必要可以构建更复杂的测试抽象.

第十二章讨论了反射, 一个程序在运行期间来检视自己的能力. 反射是一个强大的工具, 不过要谨慎地使用; 本章通过用反射实现一些重要的Go库来展示了反射的用法. 第十三章解释了低级编程的细节, 通过使用 unsafe 包来绕过Go的类型系统, 有时这是必要的.

每一章会有一些练习, 你可以根据你对Go语言的理解, 然后修改书中的例子来探索Go的其他用法.

书中所有的代码都可以从 gopl.io 上的 Git 仓库下载. go get可以根据每个例子的其导入路径方便地获取/构建/并安装. 你需要选择一个目录作为工作空间, 然后将GOPATH环境指向这个工作目录.

Go工具将在必要时创建的相应的目录. 例如:

$ export GOPATH=$HOME/gobook    # 选择工作目录
$ go get gopl.io/ch1/helloworld # 获取/编译/安装
$ $GOPATH/bin/helloworld        # 运行
Hello, 世界                     # 这是中文, 不是日文

要运行这些例子, 你需要安装Go1.5以上的版本.

$ go version go version go1.5 linux/amd64

如果你用的是其他的操作系统, 请参考 https://golang.org/doc/install 提供的说明安装.