Go 语言是怎样诞生的?
Go 语言是由三位杰出的计算机科学家共同创造的,分别是图灵奖获得者、C 语法联合发明人、Unix 之父肯·汤普森(Ken Thompson)、Plan 9 操作系统领导者、UTF-8 编码的最初设计者罗伯·派克(Rob Pike);以及 Java 的 HotSpot 虚拟机和 Chrome 浏览器的 JavaScript V8 引擎的设计者之一罗伯特·格瑞史莫(Robert Griesemer)。Go 语言的诞生可以追溯到2007年,当时这三位计算机科学家在谷歌工作,他们致力于解决一些其他编程语言在谷歌内部项目中所面临的问题。

(从左到右分别是Robert Griesemer、Rob Pike和Ken Thompson)
在 2007 年 9 月 20 日的一次普通讨论中,谷歌山景城总部的一个办公室内发生了计算机编程语言领域的一场历史性事件。那天下午,罗伯·派克启动了一个 C++ 工程的编译构建,按照以往的经验,这个构建预计需要一个小时的时间。在这段等待的时间里,罗伯·派克、罗伯特·格瑞史莫和肯·汤普森三位杰出的计算机科学家坐在一起,开始了一场关于设计新编程语言的讨论。
这个构建的等待时间让三位计算机科学家有了思考的空间,他们对当时谷歌内部主要使用的 C++ 语言面临的挑战有了深刻的认识。C++ 的复杂性、缓慢的编译构建速度以及在编写服务端程序时对并发支持的不足,成为了他们寻求新解决方案的动力。因此,他们萌生了设计一门全新编程语言的想法。
在初步构想中,这门新语言的目标是给程序员带来愉悦的编程体验,同时要符合未来硬件发展趋势,并且适合用于开发谷歌内部大规模网络服务程序。这个愿景成为了 Go 语言的奠基,而那个下午的讨论成为了开启这一新编程语言历史的重要时刻。
在第一天简短的讨论后,第二天,罗伯·派克、罗伯特·格瑞史莫和肯·汤普森这三位大佬再次齐聚在谷歌总部的“雅温得(Yaounde)”会议室里,进一步深入地讨论了新语言的设计。讨论结束后,罗伯特·格瑞史莫发出了一封题为“prog lang discussion”的电邮,对这门新编程语言的功能特性进行了初步的总结和归纳。这标志着他们在短时间内就新语言的设计达成了一些初步的共识,并正式启动了 Go 语言的雏形。

Go语言第一版特性设计稿这封电邮对这门新编程语言的功能特性做了归纳总结。主要思路是,在C语言的基础上,修正一些明显的缺陷,删除一些被诟病较多的特性,增加一些缺失的功能,比如,使用 import 替代 include、去掉宏、增加垃圾回收、支持接口等。这封电邮成为了这门新语言的第一版特性设计稿,三位大佬在这门语言的一些基础语法特性上达成了初步一致。
9 月 25 日,罗伯·派克在一封回复电邮中把这门新编程语言命名为“go”:新编程语言被命名为“go”。

在罗伯·派克的心目中,“go”这个单词短小、容易输入并且在组合其他字母后便可以用来命名 Go 相关的工具,比如编译器(goc)、汇编器(goa)、链接器(gol)等(go 的早期版本曾如此命名 go 工具链,但后续版本撤销了这种命名方式,仅保留 go 这一统一的工具链名称 )。
很多 Go 语言初学者经常称这门语言为 Golang,其实这是不对的:“Golang”仅应用于命名 Go 语言官方网站,而且当时没有用 go.com 纯粹是这个域名被占用了而已。
从“三人行”到“众人拾柴”
经过早期讨论,Go 语言的三位作者在语言设计上达成初步一致后,便开启了 Go 语言迭代设计和实现的过程。
2008 年初,Unix 之父肯·汤普森实现了第一版 Go 编译器,用于验证之前的设计。这个编译器先将 Go 代码转换为 C 代码,再由 C 编译器编译成二进制文件。
到 2008 年年中,Go 的第一版设计就基本结束了。这时,同样在谷歌工作的伊恩·泰勒(Ian Lance Taylor)为 Go 语言实现了一个 gcc 的前端,这也是 Go 语言的第二个编译器。
伊恩·泰勒的这一成果不仅仅是一种鼓励,也证明了 Go 这一新语言的可行性 。有了语言的第二个实现,对 Go 的语言规范和标准库的建立也是很重要的。随后,伊恩·泰勒以团队的第四位成员的身份正式加入 Go 语言开发团队,后面也成为了 Go 语言,以及其工具设计和实现的核心人物之一。
罗斯·考克斯(Russ Cox)是 Go 核心开发团队的第五位成员,也是在 2008 年加入的。进入团队后,罗斯·考克斯利用函数类型是“一等公民”,而且它也可以拥有自己的方法这个特性巧妙设计出了 http 包的HandlerFunc类型。这样,我们通过显式转型就可以让一个普通函数成为满足http.Handler接口的类型了。
不仅如此,罗斯·考克斯还在当时设计的基础上提出了一些更泛化的想法,比如io.Reader和io.Writer接口,这就奠定了 Go 语言的 I/O 结构模型。后来,罗斯·考克斯成为 Go 核心技术团队的负责人,推动 Go 语言的持续演化。
到这里,Go 语言最初的核心团队形成,Go 语言迈上了稳定演化的道路。
2009 年 10 月 30 日,罗伯·派克在 Google Techtalk 上做了一次有关 Go 语言的演讲“The Go Programming Language”,这也是 Go 语言第一次公之于众。十天后,也就是 2009 年 11 月 10 日,谷歌官方宣布 Go 语言项目开源,之后这一天也被 Go 官方确定为 Go 语言的诞生日。

在 Go 语言项目开源后,Go 语言也迎来了自己的“吉祥物”,是一只由罗伯·派克夫人芮妮·弗伦奇(Renee French)设计的地鼠,从此地鼠(gopher)也就成为了世界各地 Go 程序员的象征,Go 程序员也被昵称为 Gopher,在后面的课程中,我会直接使用 Gopher 指代 Go 语言开发者。

Go 语言项目的开源使得 Go 语言吸引了全世界开发者的目光,再加上 Go 三位作者在业界的影响力以及谷歌这座大树的加持,更多有才华的程序员加入到 Go 核心开发团队中,更多贡献者开始为 Go 语言项目添砖加瓦。于是,Go 在宣布开源的当年,也就是 2009 年,就成为了著名编程语言排行榜 TIOBE 的年度最佳编程语言。
2012 年 3 月 28 日,Go 1.0 版本正式发布,同时 Go 官方发布了“Go 1 兼容性”承诺:只要符合 Go 1 语言规范的源代码,Go 编译器将保证向后兼容(backwards compatible),也就是说我们使用新版编译器也可以正确编译用老版本语法编写的代码。

从此,Go 语言发展得非常迅猛。从正式开源到现在,十多年的时间过去了,Go 语言发布了多个大版本更新,逐渐成熟。
