为什么学 Go(一)
本文转自“雨夜随笔”公众号,欢迎关注
"为什么学Go"是一系列文章,这里并不介绍如何学习Go,很多同学最近在问我要不要学Go。这是一个很大的问题,就是我为什么学Go?Go究竟是什么东西?带着这些疑问,我们先去了解Go和它背后的故事。
开始
2007年,Google的三位大牛(Robert Griesemer, Rob Pike, and Ken Thompson)因为对目前Google软件开发的缓慢和笨拙感到厌烦,于是开始考虑设计一种新的编程语言,来满足自己的需要。
The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable. The language was designed by and for people who write and read and debug and maintain large software systems.
– Rob Pike, Creator of Golang –
当时的Google,由于使用了很多其他更为复杂或者难度更高的语言,比如C++,那么很多时候解决一个问题可能需要一两天。这种不合理的方式引起了Go设计者们的注意,他们希望设计一种易于使用的语言。所以目前Go的很多设计和被人诟病的问题都是源于这个最初的设计理念。Go设计者在设计Go的时候借鉴了大量C,Pascal和Oberon语言的特性。所以拥有这些语言经验的人,很容易上手Go。而Go语言一开始的设计理念就说明了这门语言并没有为初学者设置过多的门槛,所以如果想要学Go,就不要有任何心理负担的去学吧。
而Go中很多巧妙的设计就在于设计者们的智慧,他们并没有止步于改进当前的语言,因为在哪个时候,计算机大部分还都是单核处理器,而且没有Visual Studio或者Eclipse等免费IDE来帮助开发者开发。所以他们决定更进一步,去思考新语言如何去适应未来的技术发展,如何让开发者开发出更加安全有效的代码。基于此,Go设立理念中采用了很多大胆并超前的设计理念,比如对于并发提供原语性的支持,采用了更为先进的CSP并发设计模型。同时支持垃圾回收和安全的自动内存管理来减轻开发者的工作并保证程序安全。
Go设计者在一开始设计主要是为了解决Google中的开发问题,所以并没有预料到Go后来的流行。这也导致了Go中很多设计在Google中看起来合理,但是对个人或者其他公司的开发者来说并不合理。这也是你会在网上看到很多诟病Go的文章。
故事的起点
有了这个想法后,Go的三位设计者就开始了自己的设计了。在讲Go的发展前,让我们先来了解这三位大牛,就是下面三位:
可以看出Go的背景究竟是多么强大了。
Go名称的诞生就来自这一封由 Rob Pike 在 2007 年 9 月 25 号回复给 Robert Griesemer、Ken
Thompson的有关编程语言讨论主题的邮件,邮件正文大意为:
在开车回家的路上我得到了些灵感。1.给这门编程语言取名为“go”,它很简短,易书写。工具类可以命名为:goc、 gol、goa。交互式的调试工具也可以直接命名为“go”。语言文件后缀名为 .go 等等。
至此Go开始了他的诞生之旅。
重大事件
Go诞生后,三位设计者就把他们设计的成果放到公司内部的网站,这个引来了Google的另一位大牛的注意。
这是一封由Ian Lance Taylor 在 2008 年 6月 7 日(写给 Robert Griesemer、Rob Pike、 Ken Thompson 的关于 Go gcc 编译器前端的邮件。邮件正文大意如下:
我的同事向我推荐了这个网站 http://…/go_lang.html 。这似乎是一门很有趣的编程语言。我为它写了一个 gcc编译器前端。虽然这个工具仍缺少很多的功能,但它确实可以编译网站上展示的那个素数筛选程序了。
Ian Lance Taylor 的加入以及第二个编译器 (gcc go) 的实现 在带来震惊的同时,也伴随着喜悦。这对 Go
项目来说不仅仅是鼓励,更是一种对可行性的证明。语言的第二次实现对制定语言规范和确定标准库的过程至关重要,同时也有助于保证其高可移植性,这也是 Go 语言承诺的一部分。自此之后 Ian Lance Taylor 成为了设计和实现 Go 语言及其工具的核心人物。
Go可行性被证明后,Google内部成立了Go团队,来研发这门语言。至此引来了第二位大牛Russ Cox的加入。Russ 发现 Go 方法的通用性意味着函数也能拥有自己的方法,这直接促成了 http.HandlerFunc 的实现,这是一个让 Go 一下子变得无限可能的特性。Russ 还提出了更多的泛化性的想法,比如 io.Reader 和 io.Writer 接口,奠定了所有 I/O 库的整体结构。
Go不断的发展,吸引了公司的注意,公司打算加大投入来帮助Go走向外面的世界。于是聘请了安全专家Adam Langley。Adam 为 Go 团队做了许多不为外人知晓的工作,包括创建最初的 golang.org 网站以及 build ashboard。不过他最大的贡献当属创建了cryptographic库。起先,在我们中的部分人看来,这个库无论在规模还是复杂度上都不成气候。但是就是这个库在后期成为了很多重要的网络和安全软件的基础,并且成为了Go 语言开发历史的关键组成部分。许多网络基础设施公司,比如 Cloudflare,均重度依赖 Adam 在 Go 项目上的工作,互联网也因它变得更好。国内Go开发框架beego在设计的时候,session 模块设计的时候也得到了 Adam 的很多建议,因此,就 Go 而言,我们由衷地感谢 Adam。
那么Go不断得到原来越多开发者的使用。但是Go的生态大厦的构建得益于Docker的诞生,Docker的容器设计,促成了目前容器和云原生的发展。Docker完全使用Go开发,使得更多的人认识到Go的魅力。并且拓宽了Go的生态。
接下里就是Kubernetes的诞生,目前云原生的基石。可以说Go的诞生促进了云原生生态的发展。至此Go成为了可以匹敌C,C++,Java等元老级语言的存在。更多的人开始知道了Go,开始试着去了解Go。
设计理念
Go的设计理念简单来说就是五个字:“简单而有用”。Go在设计的时候就是为了这个理念而不断改进。所以我们为什么要学习Go,也是为了这个理念,从而写的更少,而做的更多。我们从目前的Go大量的应用就可以看出来,无论是Docker还是Kubernetes,都是简单的逻辑,Go程序就是减少编码的难度而增加程序员思考的时间。
接下来我们会去了解目前网上关于Go的评论究竟在说什么。对于我们学习Go的借鉴意义在哪。
参考:
The Evolution of Go: A History of Success :
https://qarea.com/blog/the-evolution-of-go-a-history-of-success
Frequently Asked Questions (FAQ) :
三分钟了解Go语言的前世今生 :
https://juejin.im/post/6844903808183566344
go语言的由来 :
https://www.jianshu.com/p/a13652d05877
版权声明: 本文为 InfoQ 作者【soolaugust】的原创文章。
原文链接:【http://xie.infoq.cn/article/9e4f799d6a388e5dbe0524763】。文章转载请联系作者。
评论