



首先,我们看看Go是怎么诞生的,这可以让你真实地了解Go的诞生缘由、设计目标,以及它究竟要解决哪些问题。
Go的创始人有3位,分别是图灵奖获得者、C语法联合发明人、UNIX之父肯·汤普森(Ken Thompson),Plan 9操作系统领导者、UTF-8编码的最初设计者罗伯·派克(Rob Pike),以及Java的HotSpot虚拟机和Chrome浏览器的JavaScript V8引擎的设计者之一罗伯特·格瑞史莫(Robert Griesemer)。
2007年9月20日下午,在Google山景城总部的一次普通讨论中,这3位天才人物萌生了创造一门新编程语言的想法,这次讨论最终成为计算机编程语言领域的一个重要历史时刻。
当天下午,罗伯·派克启动了一个C++工程的编译构建,预计耗时一小时。利用这段等待时间,他与罗伯特·格瑞史莫和肯·汤普森聚在一起,交流了关于设计一门新编程语言的构想。
他们之所以有这种想法,是因为 当时Google内部主要使用C++语言构建各种系统,但C++的复杂性、缓慢的编译构建速度,以及在编写服务端程序时对并发支持的不足 ,让这3位工程师感觉十分不便。因此,他们开始思考设计一门新的编程语言。在他们的初步设想中,这门新编程语言应该是能够为开发者带来快乐,与未来硬件发展趋势相匹配,并适合开发Google内部的大规模网络服务程序。
第二天,3位创始人在Google总部的“雅温得”(Yaounde)会议室中具体讨论了新编程语言的设计理念。会后,罗伯特·格瑞史莫发送了一封题为“prog lang discussion”(程序语言讨论)的电子邮件。在这封电子邮件中,他对新编程语言的功能特性进行了初步归纳总结,如图1.1所示。
图1.1 Go第一版功能特性设计稿
新编程语言的核心理念是, 在C语言的基础上进行改良:修正了一些明显的缺陷,移除了一些被诟病较多的特性,并增加了一些必要的功能 。例如,使用import替代include,去掉宏,增加垃圾回收机制,以及支持接口等。这封电子邮件因此成为新编程语言第一版功能特性设计稿,3位创始人在这门编程语言的基础语法特性上初步达成了一致。
9月25日,罗伯·派克在回复邮件中将这门新编程语言命名为“go”,如图1.2所示。
在罗伯·派克看来,“go”这个单词短小、容易输入,而且在与其他字母组合时,可以用来命名与Go相关的工具,例如编译器(goc)、汇编器(goa)、链接器(gol)等(Go的早期版本曾如此命名Go工具链,但后续版本撤销了这种命名方式,仅保留“go”这一统一的工具链名称)。
图1.2 新编程语言被命名为“go”
这里我还想澄清一个误区,很多Go初学者经常称这门语言为“golang”,其实这是不对的:“golang”这一名称仅用于Go的官方网站,当初之所以选择这个名称,是因为理想的域名go.com已经被占用。
在经过初期的讨论后,Go的3位创始人就语言设计达成了初步的一致,并随即开启了Go迭代设计和实现的过程。
2008年初,UNIX之父肯·汤普森实现了第一个Go编译器。这个编译器先将Go代码转换为C语言代码,再用C语言编译器生成二进制文件,以此来验证之前的设计理念。
至2008年中期,Go的第一版设计基本完成。这时,同样在Google工作的伊恩·兰斯·泰勒(Ian Lance Taylor)发了一封电子邮件给Go开发团队。在电子邮件中伊恩表示他实现了gccgo,如图1.3所示。
图1.3 伊恩实现了gccgo
伊恩基于Go的规范,为Go实现了一个gcc前端,这成为Go的第二个编译器。伊恩的这一贡献不仅鼓舞了Go开发团队,也验证了Go作为一种新编程语言的可行性。第二个编译器的实现对Go的语言规范和标准库的建设至关重要。随后,伊恩作为第四位成员加入了Go开发团队,并逐渐成为Go及其工具设计和实现的核心人物之一。
罗斯·考克斯(Russ Cox)是Go开发团队的第五位成员,他在2008年加入该团队。加入团队后,罗斯巧妙地利用Go中函数类型作为“一等公民”,并可以拥有自己方法的特性,设计出http包中的HandlerFunc类型。这样,通过显式转换,就可以让一个普通函数满足http.Handler接口。
不仅如此,罗斯还提出了更为泛化的想法,例如io.Reader和io.Writer接口,这些为Go的I/O结构模型奠定了基础。
至此,Go最初的开发团队组建完成,Go迈上了稳定发展的道路。
小贴士
近年来,随着肯·汤普森和罗伯·派克逐渐减少一线工作,罗斯·考克斯已经成为Go开发团队的技术领导者,继续引领着Go的发展。
2009年10月30日,罗伯·派克在Google TechTalk上发表了题为“The Go Programming Language”的演讲,这是Go首次公开亮相。2009年11月10日,Google正式宣布Go项目开源(见图1.4),这一天后来被Go官方认定为Go的诞生日。
图1.4 Google宣布Go项目开源
Go项目开源后,Go的第一版官网也正式上线,如图1.5所示。
图1.5 Go的第一版官网
你可能注意到,Go官网左上角有一个可爱的地鼠(gopher)形象,这是由罗伯·派克的夫人芮妮·弗伦奇(Renee French)设计的Go“吉祥物”(见图1.6)。从此,地鼠也就成了全球Go开发者的象征,而Go开发者也被人们亲切地称为Gopher 。 在本书后续内容中,我将直接使用Gopher指代Go开发者。
图1.6 Go的吉祥物
Go项目的开源吸引了全球开发者的目光,加之Go的3位创始人在业界的影响力以及Google的支持,越来越多有才华的开发者加入了Go开发团队,众多贡献者开始为Go项目贡献力量。因此, 在Go宣布开源的同年,也就是2009年,它荣获了TIOBE编程语言排行榜的年度最佳编程语言称号 。
2012年3月28日,Go 1.0版本正式发布(见图1.7),同时,Go官方发布了“Go 1兼容性”承诺: 对于遵循Go 1版本语言规范的源代码,Go编译器将保证其向后兼容,也就是说,使用新版编译器也能够正确编译采用旧版本语法编写的代码 。
图1.7 Go 1.0版本正式发布
自此以后,Go的发展速度极为迅猛。自正式开源至今,十余年过去了,期间Go经历了多个大版本的更新,逐渐走向成熟。
经过十余年的不断打磨与优化,Go已经成为云计算时代基础设施的编程语言。如今,许多现代云计算基础设施软件中大部分流行和可靠的作品都是采用Go编写的,如Docker、Kubernetes、Prometheus、Istio、CockroachDB、InfluxDB 2.x、Harbor、Terraform、Etcd和Consul等,甚至特斯拉车辆数据遥测网关的参考实现也采用了Go进行开发。当然,这个列表还在持续增加,可见Go的影响力已经十分强大。
Go不仅在云计算基础设施领域拥有上面这些重量级应用,其用户数量在近几年迅速增长。针对这一增长趋势,Go开发团队的技术领导者罗斯·考克斯甚至专门写过一篇文章。在这篇文章中,他估算全球范围内的Gopher数量从2017年中期的大约100万,增长到2019年11月的接近196万,再到2021年中期的大约250万。这一庞大的Gopher群体为Go的未来发展提供了持续的增长潜力和广阔的前景。
那么,Go的前景究竟如何,值不值得学习?
可以借鉴一种成熟的方法来客观地评估Go的历史发展趋势,并预测其未来走势。考虑到这一点,我认为Gartner的技术成熟度曲线(The Hype Cycle)提供了一个适用的框架。
Gartner的技术成熟度曲线(见图1.8),又称为技术循环曲线,是企业用于评估新技术是否采纳以及其最佳采纳时机的一种可视化工具。它通过时间轴和市场可见度(如媒体曝光度)来辅助决策者确定新技术的采纳策略。
图1.8 Gartner的技术成熟度曲线
如果我们将技术成熟度曲线应用于编程语言,例如Go,以此判断该编程语言所处的发展阶段,辅助我们决定是否以及何时采用这种编程语言。
我们从TIOBE编程语言排行榜获取了Go自2009年开源至今的指数曲线图,并根据Go版本发布历史在图中标记出各个时段的Go发布版本,如图1.9所示。
对比Gartner的技术成熟度曲线,我们可以得出这样的结论:Go在经历了一段漫长的技术萌芽期后,从实现自举的Go 1.5版本开始逐步进入期望膨胀期,在经历了Go 1.6版本至Go 1.9版本的发布后,业界对Go的期望达到了峰值。但随后进入了泡沫破裂谷底期,在Go 1.11版本发布前,这一期望跌至谷底。但Go 1.11版本引入了Go module特性,为社区解决Go包依赖问题提供了强大支持,于是,Go开始了缓慢地爬升。
从TIOBE提供的数据来看,Go 从1.12版本到1.22版本的发布表明Go已经逐渐走出泡沫破裂谷底期,进入了稳步爬升光明期。按照TIOBE官方的说法,在Top10之外的编程语言中,Go是最有希望进入Top10的编程语言。2023年4月,这一预测得到验证,Go一度闯入排行榜Top10。到了 2024年2月,Go更是再次跻身Top10,并且位列第8名,这是Go历史上的最高排名 。
图1.9 Go的技术成熟度曲线
除了TIOBE编程语言排行榜以外,Go在其他一些排行榜上的表现也印证了这一点。例如,在世界最大的开源代码托管平台GitHub于2023年发布的报告中,Go跻身语言排行榜Top10。
如前所述,一种编程语言的历史和现状能够为学习者提供“安全感”,这种安全感源于相信该编程语言可以提升个人价值并带来丰厚回报。它帮助我们明确学习的目的,并对编程语言的未来发展趋势有更深入的了解。当这种编程语言的现状能给予我们极大的“安全感”时,我们会更加坚定地学习和钻研这种编程语言,而不会有太多的后顾之忧。
从Go本身的发展来看,与大多数编程语言一样,Go在诞生初期经历了一段较长的技术萌芽期。之后,Go实现了自举。此外,对GC延迟进行了大幅优化的Go 1.5版本成为Go演化过程中的第一个“引爆点”,推动Go进入期望膨胀期。
在这个时期,Go迅速推出了以Docker、Kubernetes为典型代表的“重量级应用”,充分展现了其实力,并在全世界范围内收获了百万粉丝,迸发出极大的潜力和持续的活力。
回顾计算机编程语言的历史,可以发现,绝大多数主流编程语言会在其发展的15至20年取得显著的进步。Java、Python、Ruby、JavaScript等众多编程语言都是这样的。 如今Go马上进入自己的黄金期 ,前面的技术成熟度曲线分析也印证了这一点: Go已经进入稳步爬升的光明期 。
对于开发者,基于这些因素,可以说,学习Go的最佳时机已经到来!