1.1 Go语言的诞生
2007年9月20日的下午,在谷歌山景城总部的一间办公室里,谷歌的大佬级程序员Rob Pike[1]启动了一个C++工程的编译构建。按照以往的经验判断,这次构建大约需要一个小时。利用这段时间,Rob Pike与谷歌的另两个大佬级程序员Robert Griesemer[2]和Ken Thompson[3](见图1-1)进行了一次有关设计一门新编程语言的讨论,而这次讨论成为Go语言诞生的“导火索”。
图1-1 Go语言之父(从左到右分别是Robert Griesemer、Rob Pike和Ken Thompson)
当时的谷歌内部主要使用C++语言构建各种系统,但C++复杂性高,编译构建速度慢,在编写服务端程序时不便支持并发。诸如此类的一些问题让三位大佬产生了设计一门新编程语言的想法。在他们的初步构想中,这门新语言应该是能够给程序员带来快乐、匹配未来硬件发展趋势并适合用来开发谷歌内部大规模程序的。
趁热打铁!在第一天的简短讨论后,第二天三人又在总部的一间名为Yaounde的会议室里开了一场有关这门新语言具体设计的会议。会后的第二天,Robert Griesemer发出了一封题为“prog lang discussion”的电邮[4]。这封电邮将这些天来三人对这门新编程语言的功能特性的讨论结果做了归纳总结,其主要思路是:在C语言的基础上,修正一些明显的缺陷,删除一些被诟病较多的特性,增加一些缺失的功能。具体功能和特性如下。
- 使用import替代include。
- 去掉宏(macro)。
- 理想情况是用一个源文件替代.h和.c文件,模块的接口应该被自动提取出来(而无须手动在.h文件中声明)。
- 语句像C语言一样,但需要修正switch语句的缺陷。
- 表达式像C语言一样,但有一些注意事项(比如是否需要逗号表达式)。
- 基本上是强类型的,但可能需要支持运行时类型。
- 数组应该总是有边界检查。
- 具备垃圾回收的机制。
- 支持接口(interface)。
- 支持嵌套和匿名函数/闭包。
- 一个简单的编译器。
- 各种语言机制应该能产生可预测的代码。
这封电邮成为这门新语言的第一版设计稿,三位大佬在这门语言的一些基础语法特性上初步达成一致。
2007年9月25日,Rob Pike在一封回复电邮中把这门新编程语言命名为go[5]。在Rob Pike的心目中,go这个单词短小、容易输入并且在组合其他字母后便可以用来命名Go相关的工具,比如编译器(goc)、汇编器(goa)、链接器(gol)等。(go的早期版本曾如此命名,但后续版本撤销了这种命名方式,仅保留go这一统一的工具链名称。)很多Go语言初学者经常称这门语言为golang,其实这是不对的:golang仅应用于命名Go语言官方网站,当时之所以使用golang.org作为Go语言官方域名,是因为go.com已经被迪士尼公司占用了。