Go语言学习指南:惯例模式与编程实践
上QQ阅读APP看书,第一时间看更新

前言

最初我想给本书取名为Boring Go,因为用Go语言编写程序确实很无趣。

就一个无趣的主题来写一本书可能看起来有点奇怪,所以我应该再解释一下。Go有小部分功能集与大多数其他现代编程语言格格不入。编写良好的Go程序往往简单明了,有时还有些重复。Go语言没有继承,没有泛型(目前还没有),没有面向切面的编程(aspect-oriented programming),没有函数重载,没有操作符重载,没有模式匹配,没有命名参数,没有异常。让很多人望而生畏的是,Go竟然有指针。Go的并发模型也与其他语言不同,但它基于20世纪70年代的思想,其垃圾收集器使用的算法也是如此。简言之,Go有些复古,而这正是关键所在。

不过,无趣并不意味着平庸。要想正确使用Go,就需要了解它的功能是如何整合在一起的。即使你能够写出看起来像Java或Python的Go代码,也并不会满足于得到的结果,并且想弄清楚所有这些特性背后的底层机制是怎么回事。这正是本书的意义所在。本书清楚地介绍了Go的特性,解释了如何才能最大限度地使用它们来编写可长期维护且符合Go语言惯例的代码。

在需要构建某种可持续发展的事物时,无趣是件好事。如果一座桥是用一项未经测试的技术建造而成的,即使工程师认为这项技术超级酷,也绝没有人愿意成为第一个开车通过的人。许多编程语言在添加特性时并没有考虑它们对代码库可维护性的影响。Go的目标正是让开发者能够更容易、更高效地在几十年的软件生命周期中持续构建规模化的软件。

Go语言确实很无趣,但是也很奇妙。希望本书能够教会你如何用无趣的代码构建令人振奋的项目。

目标读者

本书的目标读者是想要学习Go语言的开发者,尤其是Go语言的初学者。本书的重点不是简单地用Go写程序,而是写出符合Go语言惯例的程序。有经验的Go开发者可以在书中找到关于如何最有效地使用该语言的新特性的建议。最重要的是,读者希望能够学到如何写出像Go一样的Go代码。

读者需要有开发者行业工具的使用经验,比如版本控制(最好是Git)和IDE。读者还应该熟悉基本的计算机科学概念,如并发编程和抽象,因为书中解释了它们如何在Go中工作。其中一些代码示例可以从GitHub上下载,还有几十个示例可以在The Go Playground上在线试用。虽然互联网连接不是必需的,但它在回顾可执行示例时很有帮助。由于Go经常被用来构建和调用HTTP服务端,所以有些示例需要读者熟悉基本的HTTP概念。

虽然Go的大部分特性在其他语言中都能找到,但Go做出了不同的权衡,所以用它编写的程序具有不同的结构。学习Go首先要从设置Go开发环境开始,然后涵盖变量、类型、流程控制和功能。请不要跳过这些细节,正是这些细节让你的代码符合Go的惯例。

排版约定

本书中使用以下排版约定:

斜体(Italic

表示新的术语、URL、电子邮件地址、文件名和文件扩展名。

等宽字体(Constant width

用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、数据类型、环境变量、语句以及关键字。

等宽粗体(Constant width bold

表示应由用户直接输入的命令或其他文本。

等宽斜体(Constant width italic

表示应由用户提供的值或由上下文确定的值替换的文本。

 该图示表示提示或建议。

 该图示表示一般性说明。

 该图示表示警告或注意。

示例代码

可以从https://github.com/learning-go-book下载补充材料(示例代码、练习、勘误等)。

这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O'Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O'Reilly的示例代码则需要获得许可。引用本书的示例代码来回答问题也不需要许可,将本书中的很大一部分示例代码放到自己的产品文档中则需要获得许可。

非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处时包含书名、作者、出版社和ISBN,例如:

Learning Go,作者Jon Bodner,由O'Reilly出版,书号978-1-492-07721-3

如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。

O'Reilly在线学习平台(O'Reilly Online Learning)

 40多年来,O'Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。

我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O'Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O'Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com

如何联系我们

对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。

美国:

O'Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

要询问技术问题或对本书提出建议,请发送电子邮件至errata@oreilly.com.cn

本书配套网站https://oreil.ly/learn-go上列出了勘误表、示例以及其他信息。

关于书籍、课程、会议和新闻的更多信息,请访问我们的网站http://oreilly.com

我们在Facebook上的地址:http://facebook.com/oreilly

我们在Twitter上的地址:http://twitter.com/oreillymedia

我们在YouTube上的地址:http://www.youtube.com/oreillymedia

致谢

写书似乎应当是一项孤独的任务,但如果没有大家的帮助,本书就不会问世。在2019年的GopherCon大会上,我向Carmen Andoh提出想写一本关于Go语言的书,于是她把我介绍给O'Reilly出版社的Zan McQuade。Zan指导我完成了签约,并在我写作本书的过程中持续向我提供宝贵的建议。责任编辑Michele Cronin审校了全书并给予反馈,在我遇到无法避免的困难时耐心倾听。感谢文字编辑Tonya Trybula和制作编辑Beth Kelly,他们大幅提升了书稿质量,使本书得以顺利出版。

在本书的写作过程中,我得到了很多人的反馈和鼓励,其中有Jonathan Altman、Jonathan Amsterdam、Johnny Ray Austin、Chris Fauerbach、Chris Hines、Bill Kennedy、Tony Nelson、Phil Pearl、Liz Rice、Aaron Schlesinger、Chris Stout、Kapil Thangavelu、Claire Trivisonno、Volker Uhrig、Jeff Wendling和Kris Zaragoza。特别感谢Rob Liebowitz的大力帮助,如果没有他的详细批改和迅速反馈,本书远远达不到现在的水平。

感谢我的家人容忍我每个夜晚和周末都在计算机前度过,而不是陪伴他们。特别感谢我的妻子Laura,当我凌晨1点或更晚才上床睡觉时,她总是贴心地假装没有被我吵醒。

最后,我想对40年前引领我走上这条道路的两个人表达谢意。首先是Paul Goldstein,他是我一个儿时朋友的父亲。1982年,Paul向我们展示了一台Commodore PET,他先输入PRINT 2 + 2,然后按下回车键。当屏幕上显示4时,我惊呆了,顿时就被深深地吸引住了。后来他教我如何编程,甚至将这台PET借我用了几个星期。其次是我的母亲,她鼓励我对于编程和计算机的兴趣,尽管当时我根本不知道这些东西有什么用。她给我买了Atari 2600的BASIC编程盒、VIC-20和Commodore 64,以及一些编程书,这些书激发了我有朝一日自己写书的想法。

感谢他们帮助我实现了梦想。