2020-09-08 更新
tonybai · Go语言技术专家
2007 年 9 月 20 日的下午,在谷歌山景城总部的一间办公室里,谷歌的大佬级程序员 Rob Pike1在等待一个 C++ 项目构建的过程中和谷歌的另外两个大佬级程序员 Robert Griesemer2和 Ken Thompson3进行了一次有关设计一门新编程语言的讨论4。
当时的谷歌内部主要使用 C++ 语言构建各种系统,但 C++ 的巨大复杂性、编译构建速度慢以及在编写服务端程序时对并发支持的不便等让三位大佬产生了重新设计一门新编程语言的想法。在他们的初步构想中,这门新语言应该是能够给程序员带来快乐、匹配未来硬件发展趋势并适合用来开发谷歌内部大规模程序的。
趁热打铁!在第一天的简短讨论后,第二天这三位大佬又在总部的一间名为 Yaounde 的会议室里进行了一场有关这门新语言具体设计的会议。会后的第二天,Robert Griesemer 发出了一封题为“prog lang discussion”的电邮,这封电邮便成为了这门新语言的第一版设计稿,三位大佬在这门语言的一些基础语法特性上达成了初步一致。
9 月 25 日,Rob Pike 在一封回复电邮中把这门新编程语言命名为 Go:
Subject: Re: prog lang discussion
From: Rob 'Commander' Pike
Date: Tue, Sep 25, 2007 at 3:12 PM
To: Robert Griesemer, Ken Thompson
i had a couple of thoughts on the drive home.
1. name
'go'. you can invent reasons for this name but it has nice properties.
it's short, easy to type. tools: goc, gol, goa. if there's an interactive
debugger/interpreter it could just be called 'go'. the suffix is .go
...
经过早期讨论,三位 Go 作者在语言设计上达成初步一致后,便开启了 Go 语言迭代设计和实现的过程。
2008 年初,Unix 之父 Ken Thompson 实现了第一版 Go 编译器,用于验证之前的设计。这个编译器先将 Go 代码转换为 C 代码,再由 C 编译器编译成二进制文件。
到 2008 年中旬,Go 的第一版设计基本结束了。这时,同样在谷歌工作的 Ian Lance Taylor 给 Go 语言的三位作者发了一封电子邮件。他宣称为 Go 语言实现了一个 gcc 的前端,这也是 Go 语言的第二个编译器。
Subject: A gcc frontend for Go
From: Ian Lance Taylor
Date: Sat, Jun 7, 2008 at 7:06 PM
To: Robert Griesemer, Rob Pike, Ken Thompson
One of my office-mates pointed me at http://.../go_lang.html . It
seems like an interesting language, and I threw together a gcc
frontend for it. It's missing a lot of features, of course, but it
does compile the prime sieve code on the web page.
随后,Ian Lance Taylor 正式加入 Go 语言开发团队,并在后面的 Go 语言发展演进进程中成为了 Go 语言及工具设计和实现的核心人物之一。Russ Cox 也是在 2008 年加入到刚成立不久的 Go 语言开发团队的。随着他的加入,他的一些天赋也随即在语言设计和实现中展现出来,比如io.Reader和io.Writer接口,奠定了所有 I/O 库的整体结构。
2009 年 10 月 30 日,Rob Pike 在 Google Techtalk 上做了一次有关 Go 语言的演讲《The Go Programming Language》,这也是 Go 语言第一次公之于众。
Go 语言项目在 2009 年 11 月 10 日正式开源,之后这一天被官方定位 Go 语言的诞辰。最初 Go 语言项目托管在 code.google.com 上,几年后迁移至 GitHub。
随着 Go 语言的开源,Go 语言吸引了全世界开发者的目光。再加上 Go 三位作者在业界的影响力以及谷歌这座大树的加持,更多有才华的程序员加入到 Go 开发团队中,更多贡献者开始为 Go 语言项目添砖加瓦。于是,Go 在发布的当年(2009 年)就成为了著名编程语言排行榜 TIOBE 的年度最佳编程语言。
Go 发布后就吸引了一些公司,尤其是云计算领域的初创公司成为了 Go 语言的早期接纳者。在经过若干年的磨合后,在这些公司中诞生了不乏像 Docker、Kubernetes 这样的“杀手级”或示范性项目,这些项目也让 Go 被誉为“云计算基础设施新兴语言”或直接称为云计算语言。
在发布后,Go 语言也拥有了自己的“吉祥物” - 一只由 Rob Pike 夫人Renee French设计的地鼠,从此地鼠称为了世界各地 Go 程序员的象征。Go 程序员也被称为 Gopher,Go 语言官方技术大会也被称为 GopherCon。
和绝大多数编程语言相似,Go 语言也是“站在巨人的肩膀上的”,正如下图所示,Go 继承了诸多编程语言的特性。
Go 的基本语法参考了 C 语言,是“C 家族语言”的一个分支;而 Go 的声明语法、包概念则受到了 Pascal/Modula/Oberon 的启发;一些并发的思想则来自于受到了 Tony Hoare 教授 CSP 理论影响的语言,比如:Newsqueak 和 Limbo。
2009 年 11 月 10 日,Go 语言正式对外发布并开源。之后,Go 语言在一段时间内采用了“Weekly Release”的模式,即每周发布一个版本。目前我们在 github.com 上 golang 的官方仓库中仍能找到的早期的 Weekly Release 版本,比如:“weekly.2009-11-06”。
从 2011 年 3 月 7 日开始,除了 Weekly Release,Go 项目还会每月发布一个 Release,即 Monthly Release,比如:release.r56,这种情况一直延续到 Go 1.0 版本发布之前;
2012 年 3 月 28 日,Go 1.0 正式发布。同时 Go 官方发布 Go1 兼容性承诺:只要符合 Go1 语言规范的源代码,Go 编译器将保证向后兼容;
2013 年 5 月 13 日,Go 1.1 版本发布。主要的变动点包括:
2013 年 12 月 1 日,Go 1.2 版本发布。从 Go 1.2 开始,Go 开发组启动了“以每 6 个月为一个发布周期”的发布计划。Go 1.2 版本主要的变动点包括:
2014 年 6 月 18 日,Go 1.3 版本发布。主要的变动点包括:
2014 年 12 月 10 日,Go 1.4 版本发布。Go 1.4 也是最后一个编译器和 runtime 由 C 语言实现的版本。其主要的变动点包括:
2015 年 8 月 19 日,Go 1.5 版本发布,Go 1.5 版本是一个里程碑式的重要版本。因为从这个版本开始,Go 实现了自举,即无需再依赖 C 编译器。但 Go 编译器的性能照比 Go 1.4 的 C 实现有了较大幅度的下降。其主要的变动点包括:
2016 年 2 月 17 日,Go 1.6 版本发布。主要的变动点包括:
2016 年 8 月 15 日,Go 1.7 版本发布。主要的变动点包括:
2017 年 2 月 16 日,Go 1.8 版本发布。主要的变动点包括:
2017 年 8 月 25 日,Go 1.9 版本发布。主要的变动点包括:
2018 年 2 月 17 日,Go 1.10 版本发布。主要的变动点包括:
2018 年 8 月 25 日,Go 1.11 版本发布。Go 1.11是Russ Cox在GopherCon 2017 大会上发表 "Toward Go2"之后的第一个 Go 版本,新的 Go 包管理机制 go modules 在 Go 1.11 中的落地为后续“Go2”的提议渐进落地奠定了良好的基础。该版本主要的变动点包括:
2019 年 2 月 25 日,Go 1.12 版本发布。主要的变动点包括:
2019 年 9 月 4 日,Go 1.13 版本发布。主要的变动点包括:
0b111
;0o700
;0x123.86p+2
;a := 5_3_7
等;>>
和<<
)的右操作数仅能是无符号数的限制;GO111MODULE=auto
时,无论是在$GOPATH/src 下还是 GOPATH 之外的仓库中>,只要目录下有 go.mod,Go 编译器都会使用 go module 来管理依赖;GOPROXY 支持配置多个代理,默认值为https://proxy.golang.org,direct
;提供了 GOPRIVATE 变量,用于指示哪些仓库下的 module 是私有的,即不需要通过 GOPROXY 下载,也不需要通过 GOSUMDB 去验证其校验和;2020 年 2 月 26 日,Go 1.14 版本发布。主要的变动点包括:
Cleanup
方法用于实现测试执行后的清理工作。Go 团队发布的 Go 语言稳定版本总体质量一直很高,少有影响使用的重大 bug。Go 团队一直建议大家使用最新的发布版。Google 的产品,比如 Google App Engine(以下简称为 GAE),向来是这方面的“急先锋” —— 一般在 Go 新版本发布不久后,GAE 便会宣布支持最新版本的 Go。
Go 团队每年发布两次大版本,一般是在二月份和八月份发布。Go 团队对最新的两个 Go 稳定版本提供支持,比如如果目前最新版本是 Go 1.14,那么 Go 团队会为 Go 1.14 和 Go 1.13 提供支持。如果 Go 1.15 版本发布,支持的版本将变成 Go 1.15 和 Go 1.14。支持的范围主要包括修复版本中存在的重大问题、仅文档变更以及安全问题更新。
了解一门编程语言的诞生历史和早期演化史,有助于程序员在学习这门语言的同时产生或加深对语言的认同感。程序员能感同身受,从而能更加有热情的投入到这门语言的学习和使用当中。同时这种认同感也能积极推动程序员在后续的实践中形成语言的原生思维(比如:Go 语言思维),从而更加高效地利用这门语言进行编程,解决实际问题。
同时,了解 Go 版本的发布历史以及不同版本的主要变动点,将有助于程序员根据自身的实际情况选择最为适合的 Go 版本。
Rob Pike(罗伯·派克),早期贝尔实验室成员,参与了 Plan9 操作系统、C 编译器以及多种语言编译器的设计和实现,UTF-8 发明人之一。 ↩︎
Robert Griesemer(罗伯特·格瑞史莫),Java 的 HotSpot 虚拟机和 Chrome 浏览器的 JavaScript V8 引擎的设计者之一。 ↩︎
Ken Thompson(肯·汤普逊),图灵奖得主、Unix 之父以及 C 语言的发明人之一。 ↩︎
“少即是多” - https://commandcenter.blogspot.com/2012/06/less-is-exponentially-more.html ↩︎
©版权归慕课网所有,未经许可不得转载
精选留言 写留言
小彗星麦兜
2021-03-15 0 3
慕姐2298172
2020-11-09 0 5
绾绾爱吃肉
2020-09-14 2 5
开心每一天1111
2020-09-11 2 2