跳到主要内容
HHuan Du
7 分钟阅读

学习 Go 的一些资料指引

从 Essential Go 到 Go Web 编程:我推荐给 Go 初学者的几份资料,以及它们各自适合的阶段。

  • #go
  • #resources

Go 在国内变得越来越火。还记得 2015 年在公司推广 Go 的时候,大家还是抱有极大的怀疑,观望多于实践,更不敢随便用于线上。今天,我们不但已经在生产环境中首选 Go,还有越来越多的其他语言背景的开发者主动学习 Go,一旦有机会就想用 Go 写点东西。

Go 相对很多主流编程语言来说是比较好入门的,主要原因是语法比较简单。最经典的交互式入门教程是官方的 Go tour,不过由于众所周知的原因在国内打不开这个网站,我们可以直接下载源码在本地运行。如果希望更加系统的学习 Go,或者希望寻找一个中文入门书籍,我可以做一些推荐和比较,希望能对大家有些帮助。

推荐一:Essential Go

这是一本免费的电子书,全英文,对于英语不错的开发者来说首选这个电子书来入门。这个电子书最大的特色是包含非常多的可执行的代码片段,整本书的理念是“案例驱动”(driver by examples),所有章节都非常好的贯彻了这一点。

这里贴一段经过我翻译的章节 Interfaces 给大家感受一下:

接口描述了类型的一系列方法,类似于 C# 里面的 interface。接口用来抽象行为,比如标准库按照下面的代码定义了 io.Reader 接口:

type Reader interface {
    Read(d []byte) (int, error)
}

不少操作二进制数据流的函数(比如 JSON 解码)使用 io.Reader 作为数据源。这让我们可以为物理文件、内存数据、网络连接等实现 io.Reader 接口,并且让 json.Decode 在所有这些数据源上工作。
下面是如何定义和实现一个简单的接口:
……(省略代码)

不知道大家感觉怎么样,我个人觉得这本书比较简单易读。当然,如果我的翻译让原文变得晦涩,请轻拍。

这本书也有几个比较大的问题,首当其冲的是过于细了。前几章用来入门还行,后面用大量的文字和案例覆盖了大部分标准库常用功能,这实在有点冗余。建议看这本书的时候看到 Packages 那一章就差不多了,后面可以当做工具书随时查。其次,这本书也缺乏贴近实际的应用场景,可能看完了也不太能写一个完整的项目。

推荐二:Go Web 编程,谢孟军(astaxie)

这也是一本免费的电子书,有实体书可以购买。这本书的最大特色是“实用”,全书围绕如何用 Go 实现 Web 编程来展开,几乎覆盖了 Web 编程的方方面面,看完之后就可以直接写出完整的网站。美中不足是语言本身讲的有些少,只是蜻蜓点水般的给了些例子,要想理解透彻还需要自己课外加餐。

推荐三:Go 并发编程实战,郝林(hyper0x)

这是一本实体书,作者曾经自己提供过电子版下载,不过现在找不到了。这本书最大的特色是“详实”,基础讲的很细很清楚,有大量的图表来说明 Go 的工作原理,对读者非常友好。跟前面两本书相比,它是一个很好的折衷。

还有一些不错的入门资料,这里限于篇幅暂时不再展开。

随着接触的 Go 开发者越来越多,我自己也在思考怎么才算入门,哪些是真正必要掌握的技能。根据我阅读实际 Go 业务代码的经验,我简单总结了几点:

  • 熟练掌握类似 C 的基本语法:各种最基本的语法,基本不超出 C 的范围,包括表达式、函数调用、structtype等。我发现业务代码中一般不太会定义新的 interface,一般只要会用即可。不像 Java 那样需要用 implements 关键字来显式的实现一个接口,Go 里面只要恰好实现了 interface 所要求的方法就可以,整个业务代码都可以完全不出现 interface 关键字和接口名。
  • 会用标准库进行开发: Go 的标准库包含比较丰富的功能,大多数业务功能可以直接使用标准库来实现,会用标准库、特别是懂得如何找到合适的函数,这非常重要。
  • 会使用包管理工具:Go 项目大了之后不可避免要引入大量公司内和开源的包,简单使用 go get 会造成版本管理混乱,为了让多人协作和构建过程更容易,需要使用一种包管理工具来解决问题。我们曾经选用过多种不同的工具,当前公司已经统一使用 glide。随着 Go 官方的 go mod 逐步成熟,或许未来会改用官方工具。
  • 懂得如何调试问题和性能调优: 写业务代码难免会遇到 bug,追查问题是家常便饭,如果不懂得怎么断点调试、怎么用 go tool pprof,基本很难写出高质量代码。由于当前 IDE 已经非常成熟,无论是 Goland 还是 VS Code 都已经提供相当完备的开发环境,这件事情基本等同于要摸清楚工具,花点时间练习一下就行,难度并不太大。

Go 的最大特色是并发编程,go 关键词、 goroutine 、chan 是所有书都会重点提及的内容,这些知识非常重要,但它们在业务实践中用的并不多。也许跟常识有些不相符:一个熟练写业务代码的 Go 开发者可以不去学怎么使用 go 关键字和 chan 就能完成任务。 并发编程、跨线程通信等细节往往隐藏在各种开发框架中,无需业务开发者关心,甚至有些团队会明令禁止使用 go 关键词,而使用自行封装的函数来启动 goroutine,这样方便做一些自动 recover 和传递上下文的事情。

还有大量技术是写业务代码不太用上的:单元测试(唉!)、反射、cgo、汇编、运行时特性等等。这些知识都非常重要,只是从实用角度来看,学习的优先级没有那么高。

从实际投入业务开发的角度来看,我发现似乎并没有一本书或一个教程可以从务实的角度培养一个合格的 Go 开发者。如果学习知识采用更贴近工程实践节奏的方法来进行,而不是按部就班的从基础学到所有库,会不会学习效果更好呢?

或许这个想法值得尝试,我未来会写一些这方面的文章和教程,希望能对大家有所帮助。

~ fin ~

本文最初于 2018-11-02 发布在知乎