一 Go语言的诞生
已经有那么多编程语言了,为何还要再造一门Go???
一方面:从大的维度分析
另外一方面:从具体的问题分析
面对主流编程语言,开发者不得不在其简洁性/开发效率、编译和运行的高效性、代码的可读性、类型系统的轻量性等方面纠结徘徊,或者像 Google 一样采取多语言并用的策略。但是,随着项目规模的不断扩大,开发和维护的复杂性也正在把Google公司一步一步拖入泥潭中……
时间回溯到 2007 年,那个时候,GitHub 还未问世,Intel 也才在前一年刚推出自家的第一个多核微处理器 Core 2(微处理器,简单来说,就是将 CPU 的所有元件都放入同一块芯片中的东东)。彼时的 Google 已然成长为一家全球科技巨头,与之相随的便是行数与复杂度不断增长的代码量,Google公司开发遇到了棘手的问题。。。。。。
1、系统越来越复杂:大量的代码是由C++、Java,并辅以 Python 写成
2、规模越来越庞大:成千上万的工程师每天都在围绕着数以万计行的代码及其分布式的编译系统、数百万的服务器工作着以保证各项服务的正常运行
面对如此庞大的开发规模,人才济济的谷歌虽然通过各种技术手段得以“逆风飞翔”,但是此种状态却带来了慢速、低效,甚至稍显笨拙的开发体验。随着系统进一步复杂、规模进一步庞大,下述痛点也都在进一步被放大:
- 编译慢
- 失控的依赖
- 每个工程师只是用了一个语言里面的一部分
- 程序难以维护(可读性差、文档不清晰等)
- 更新的花费越来越长
- 交叉编译困难
如何解决呢?
正遭遇上述问题的 Google 工程师们开始坐立不安了,他们一边对现状充满沮丧,一边回望过去,沉思良久,希望搞明白问题所在。这些在计算机语言领域已深耕多年,富有经验的工程师们意识到,不能简单地通过现有语言的单个特性,或添加某些库就能很好地解决现存问题,站在软件工程的更高角度,顺应技术的发展创造一门全新的语言才是当下亟需要做的事情。
于是,谷歌公司的三位工程师于 2007 年 9 月 20 号下午进行一次讨论,正是这次讨论才有了第二天组织在位于加利福尼亚的山景城 43 号楼的三人会议。没错,与会的三人 Robert Griesemer,Rob Pike 和 Ken Thompson 就是 Go 的创始人,他们均在 Google 任职,其中的 Ken 就是那个发明了 UNIX、B语言的神一样的男子。
-
1、Robert Griesemer罗伯特.格利茨默(Java HotSpot虚拟机、V8引擎开发者之一)
-
2、Rob Pike罗伯.派克(贝尔实验室UNIX团队成员,曾参与Plan9、Inferno和Limbo等项目)
-
3、Ken Thompson肯.汤普森(贝尔实验室UNIX团队成员,C语言、UNIX和Plan 9创始人之一,与Rob Pike共同开发了UTF-8字符集规范)
下图从左到右依次排序
刚开始,三位神仙只是一些有一些想法和愿望,但隶属行动派的三人数日之内就敲定了目标和接下来要做的事情,
最后根据实战经验,他们向着既定的目标开始设计Go语言。。。
在他们的第 1 封有关语言设计的邮件列表中,这门语言的名称 “Go” 就已初漏端倪:
Go VS Golang
由于 Google 在注册 Go 的官网域名时,go.org
已被迪士尼抢注,golang.org
才得以“上位”,这也就产生了很多人误以为 Golang
就是其正式名称的误会,而事实却恰恰相反,我们可以认为 Golang
只是 Go
的绰号。
得益于Google公司良好的企业文化,允许工程师拿出20%的时间来研究自己喜欢的项目。语音服务Google Now、谷歌新闻Google News、谷歌地图Google Map上的交通信息等,全都是20%时间的产物,Go语言最开始也是20%时间的产物。在接下来的日子里,Go 的设计等相关工作始终以兼职的形式进行着。直到 2008 年年中,Go 项目才正式“转正”,成为一个全职项目。
此间,第一件令人惊喜的事就来自那三位创始人收到的这份邮件:
邮件中 Ian (全名Ian Lance Taylor,GCC核心开发人员)讲到自己为 Go 实现了一个能进行语法分析、词法分析和语义分析的 gcc 前端编译组件。后来,Ian 也成为了 Go 的核心开发人员。
2008 年末,另一位技术大神 Russ Cox(曾参与Plan 9 操作系统的开发) 也加入到了 Go 开发团队。在他的助攻下,Go 语言和标准库从原型变成了现实。
后来还加入了Brand Fitzpatrick(memcached的作者)
Go创始团队的神仙阵容,标志着Go语言的创始团队对操作系统和系统编程有着非常深刻的理解,这对一门语言的开发起到至关重要的作用。
2009 年 11 月 10 号,Go 宣布开源,这一天也被选定为 Go 的生日🎂。
2012 年 3 月,Go version 1 正式发布,这标志着 Go 作为一门全新的编程设计语言已可投身生产,根据 Go 的 兼容性原则,我们可以放心地使用它编写简单、高效、稳定可靠的应用了。
二 Go语言的发展
Go 语言起源 2007 年
Go 从 2009 年 9 月 21 日开始正式作为谷歌公司 20% 兼职项目
2009年11月10日Google公司才正式发布Go语言,并以BSD协议完全开源,支持Linux和Mac OS平台,同年11月支持Windows平台。
下面我们以时间轴的方式梳理了在这个迭代过程中,发生了哪些里程碑式的大事件。
若想详细了解Go历史版本更迭请看: https://golang.google.cn/doc/devel/release.html
Go语言这两年在语言排行榜(https://www.tiobe.com/tiobe-index/)增长曲线如下,总体还是处于上涨趋势的
大量基于GO语言开发的杀手级应用:Docker、Kubernetes、Go-Ethereum、Thrraform、Moby、Gogs、Grafana、Etcd等。于2009、2016两次夺得TIOBE年度编程语言的称号,2020年世界排名处于第12位
发展中的 Go :最有前途的编程语言
Go 从诞生之初,就有一个明确的目标,那就是解决 Google 内部正面临的软件开发问题,这些问题并非 Google 独自的遭遇,业界普遍存在。所以,GO 不仅是一门通用编程设计语言(general-purpose language),更是一门着眼解决现实问题的实用编程语言。历经多年,核心开发者与社区众多优秀成员不断地完善改进这门语言,Go 已经发展成为了一门成熟的现代编程语言,在 web、移动应用、图形处理、以及云计算、机器学习、区块链等领域都能见到它的身影,其语言本身的简洁性、内置的并发编程支持、垃圾回收机制等特性深受开发者青睐。
JetBrains 近期发布的一份分析报告——2019 开发人员生态系统现状 在对比了主流开发语言后,得出一个结论:Go 是最有前途的编程语言。
核心开发者的持续支持,活跃的社区,日益增长的开发者众,越来越多的企业开始转投 Go 阵营,Russ Cox 在 GopherCon 2017 上做了对 Go 2 畅想的 演讲……
Go,未来可期!
三 GO语言归类
编程语言通常按照下述三点进行分类
综上
1、Python是一门开源的解释型、动态、强类型语言
2、Golang是一门开源的编译型、静态、强类型语言
四 Go语言的设计思想
1、围绕 简单 这一核心的设计
2、有自己的坚持,不盲目攀比
3、keep it simple
五 Go语言的特点
5.1 Go的优势
简明扼要地说:
1、Go 语言是一个开源项目
2、简化问题,易于学习
3、内存管理,简洁语法,易于使用
4、快速编译,高效开发
5、高效执行
6、并发支持,轻松驾驭
7、静态类型
8、标准类库,规范统一
9、易于部署
10、文档全面
11、免费开源
其余详细见附录:Go语言特性
一句话总结:它是一个快速的、静态类型的编译型语言,感觉却像动态类型的解释型语言。
5.2 关于特性缺失
许多能够在大多数面向对象语言中使用的特性 Go 语言都没有支持,但其中的一部分可能会在未来被支持。
- 为了简化设计,不支持函数重载和操作符重载
- 为了避免在 C/C++ 开发中的一些 Bug 和混乱,不支持隐式转换
- Go 语言通过另一种途径实现面向对象设计(第 10-11 章)来放弃类和类型的继承
- 尽管在接口的使用方面(第 11 章)可以实现类似变体类型的功能,但本身不支持变体类型
- 不支持动态加载代码
- 不支持动态链接库
- 不支持泛型
- 通过
recover
和panic
来替代异常机制(第 13.2-3 节) - 不支持断言
- 不支持静态变量
关于 Go 语言开发团队对于这些方面的讨论,你可以通过 Go 常见问题 页面查看。
5.3 GO的性能说明及与其他语言对比
根据 Go 开发团队和基本的算法测试,于 2013 年 3 月 28 日之前统计结果得出,Go 语言与 C 语言的性能差距大概在 10%~20% 之间。虽然没有官方的性能标准,但是与其它各个语言相比已经拥有非常出色的表现。
如果说 Go 语言的执行效率大约比 C++ 慢 20% 也许更有实际意义。保守估计在相同的环境和执行目标的情况下,Go 程序比 Java 或 Scala 应用程序要快上 2 倍,并比这两门语言使用少占用 70% 的内存。在很多情况下这种比较是没有意义的,因为像谷歌这样拥有成千上万台服务器的公司都抛弃 C++ 而开始将 Go 用于生产环境已经足够说明它本身所具有的优势。
时下流行的语言大都是运行在虚拟机上,如:Java 和 Scala 使用的 JVM,C# 和 VB.NET 使用的 .NET CLR。尽管虚拟机的性能已经有了很大的提升,但任何使用 JIT 编译器和脚本语言解释器的编程语言(Ruby、Python、Perl 和 JavaScript)在 C 和 C++ 的绝对优势下甚至都无法在性能上望其项背。
如果说 Go 比 C++ 要慢 20%,那么 Go 就要比任何非静态和编译型语言快 2 到 10 倍,并且能够更加高效地使用内存。
其实比较多门语言之间的性能是一种非常猥琐的行为,因为任何一种语言都有其所擅长和薄弱的方面。例如在处理文本方面,那些只处理纯字节的语言显然要比处理 Unicode 这种更为复杂编码的语言要出色的多。有些人可能认为使用两种不同的语言实现同一个目标能够得出正确的结论,但是很多时候测试者可能对一门语言非常了解而对另一门语言只是大概明白,测试者对程序编写的手法在一定程度也会影响结果的公平性,因此测试程序应该分别由各自语言的擅长者来编写,这样才能得到具有可比性的结果。另外,像在统计学方面,人们很难避免人为因素对结果的影响,所以这在严格意义上并不是科学。还要注意的是,测试结果的可比性还要根据测试目标来区别,例如很多发展十多年的语言已经针对各类问题拥有非常成熟的类库,而作为一门新生语言的 Go 语言,并没有足够的时间来推导各类问题的最佳解决方案。如果你想获取更多有关性能的资料,请访问 Computer Language Benchmark Game。
这里有一些评测结果:
-
比较 Go 和 Python 在简单的 web 服务器方面的性能,单位为传输量每秒:
原生的 Go http 包要比 web.py 快 7 至 8 倍,如果使用 web.go 框架则稍微差点,比 web.py 快 6 至 7 倍。如果是使用Python 中的 tornado 异步服务器和框架开发出的Web应用,那么要比传统的 web.py 快很多,此时,Go 大概只比它快 1.2 至 1.5 倍,Go在Web开发的领域比Python要快,但目前来看,并非碾压态势。
-
Go 和 Python 在一般开发的平均水平测试中,Go 要比 Python 3 快 25 倍左右,少占用三分之二的内存,但比 Python 大概多写一倍的代码,毫无疑问,开发效率上,python是要技高一筹的。
-
根据 Robert Hundt(2011 年 6 月)的文章对 C++、Java、Go 和 Scala,以及 Go 开发团队的反应(),可以得出以下结论:
- Go 和 Scala 之间具有更多的可比性(都使用更少的代码),而 C++ 和 Java 都使用非常冗长的代码。
- Go 的编译速度要比绝大多数语言都要快,比 Java 和 C++ 快 5 至 6 倍,比 Scala 快 10 倍。
- Go 的二进制文件体积是最大的(每个可执行文件都包含 runtime)。
- 在最理想的情况下,Go 能够和 C++ 一样快,比 Scala 快 2 至 3 倍,比 Java 快 5 至 10 倍。
- Go 在内存管理方面也可以和 C++ 相媲美,几乎只需要 Scala 所使用的一半,比 Java 少 4 倍左右。
四 Go语言的应用场景
编程语言说到底只是一种工具,不选最好的,只选最合适的
其他
四 国内外那些公司在用Go语言
详见:“附录:哪些公司在用Go语言”
五 Go语言Logo
六 Go语言吉祥物
gopher是一种生活在加拿大的小动物,它的中文名叫做囊地鼠,是go语言的吉祥物,在会议、文档页面和博文中,大多会包含这个小吉祥物,下图是才华横溢的插画家 Renee French 设计的,她也是 Go 设计者之一 Rob Pike 的妻子,gopher最大的特点就是挖洞速度特别快,这也正好吻合Go语言追求更快的运行速度、开发速度、学习速度(develop)的思想。