Go语言简介
一 Go语言的诞生

已经有那么多编程语言了,为何还要再造一门Go???
一方面:从大的维度分析
1、近几十年来,计算机硬件飞速发展,硬件越来越廉价,并且硬件性能/抗并发能力不断攀升,超线程技术、CPU 多核化的发展和普及为并行计算提供了技术支持与编程需求,但是反观编程语言领域却没有什么大的动作,很早就诞生了C/C++在计算机领域发展的也不并好,也就是说,并没有一门专门为这个时代的硬件而生的编程语言
2、旧的编程语言无法在开发效率与执行效率之间做出很好的平衡
要么执行效率高,开发效率低、编译速度慢,如C++;
要么么执行效率低,但拥有高效的编译,如.NET、Java;
总之。go出现之前的语言在执行效率和开发效率上都不能做到鱼与熊掌兼得,如下所示
- 执行效率 execution speed: C/C++ ; Java ; Python
- 开发效率 developing efficiency: Python ; Java ; C/C++
所以,一门同时拥有高效的执行速度、编译速度和开发速度的编程语言呼之欲出,这就是Go语言诞生的前戏与大环境
另外一方面:从具体的问题分析
面对主流编程语言,开发者不得不在其简洁性/开发效率、编译和运行的高效性、代码的可读性、类型系统的轻量性等方面纠结徘徊,或者像 Google 一样采取多语言并用的策略。但是,随着项目规模的不断扩大,开发和维护的复杂性也正在把Google公司一步一步拖入泥潭中......
时间回溯到 2007 年,那个时候,GitHub 还未问世,Intel 也才在前一年刚推出自家的第一个多核微处理器 Core 2(微处理器,简单来说,就是将 CPU 的所有元件都放入同一块芯片中的东东)。彼时的 Google 已然成长为一家全球科技巨头,与之相随的便是行数与复杂度不断增长的代码量,Google公司开发遇到了棘手的问题。。。。。。 - 系统越来越复杂 大量的代码是由C++、Java,并辅以 Python 写成 - 规模越来越庞大 成千上万的工程师每天都在围绕着数以万计行的代码及其分布式的编译系统、数百万的服务器工作着 以保证各项服务的正常运行
面对如此庞大的开发规模,人才济济的谷歌虽然通过各种技术手段得以“逆风飞翔”,但是此种状态却带来了慢速、低效,甚至稍显笨拙的开发体验。随着系统进一步复杂、规模进一步庞大,下述痛点也都在进一步被放大: - 编译慢 - 失控的依赖 - 每个工程师只是用了一个语言里面的一部分 - 程序难以维护(可读性差、文档不清晰等) - 更新的花费越来越长 - 交叉编译困难
如何解决呢?
正遭遇上述问题的 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字符集规范)
刚开始,三位神仙只是一些有一些想法和愿望,但隶属行动派的三人数日之内就敲定了目标和接下来要做的事情,
- 1、Go希望成为互联网时代的C语言。多数系统级语言(包括Java和C#)的根本编程哲学来源于C++,并将C++的面向对象进一步发扬光大。但是Go语言的设计者却有不同的看法,他们认为值得学习的是C语言。C语言经久不衰的根源是它足够简单。因此,Go语言也是足够简单。
- 2、所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。
- 3、但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,所以新设计的语言一定要易学习,最好是类似C的语言;20年没有出新的语言了,所以新设计的语言必须是现代化的(例如内置GC)等情况。
最后根据实战经验,他们向着既定的目标开始设计Go语言。。。
在他们的第 1 封有关语言设计的邮件列表中,这门语言的名称 “Go” 就已初漏端倪:
Subject: Re:prog lang discussion From: Rob 'Commander' Pike
Date:Tue,Sep25,2007at3:12PM To:Robert Griesemer, Ken Thompson
i had a couple of thoughts on the drive home.
'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 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 项目才正式“转正”,成为一个全职项目。
此间,第一件令人惊喜的事就来自那三位创始人收到的这份邮件:
Subject: A gcc frontend for Go
From:Ian Lance Taylor
Date:Sat,Jun7,2008at7:06PM
To: Robert Griesemer, Rob Pike, Ken Thompson
One of my office-mates pointed me athttp://.../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 (全名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
- 2007年9月,雏形设计 ,Rob Pike(罗伯.派克) 正式命名为Go;
- 2008年5月,Google全力支持该项目;
// 2009年11月10日,首次公开发布,Go将代码全部开源,它获得了当年的年度语言;
- 2011年3月16日,Go语言的第一个稳定(stable)版本r56发布。
// 2012年3月28日,Go语言的第一个正式版本Go1发布。
- 2013年4月04日,Go语言的第一个Go 1.1beta1测试版发布。
- 2013年4月08日,Go语言的第二个Go 1.1beta2测试版发布。
- 2013年5月02日,Go语言Go 1.1RC1版发布。
RC=Release Candidate,含义是”发布候选版”,
它不是最终的版本,而是最终版(RTM=Release To Manufacture)之前的最后一个版本。
- 2013年5月07日,Go语言Go 1.1RC2版发布。
- 2013年5月09日,Go语言Go 1.1RC3版发布。
- 2013年5月13日,Go语言Go 1.1正式版发布。
- 2013年9月20日,Go语言Go 1.2RC1版发布。
- 2013年12月1日,Go语言Go 1.2正式版发布。
- 2014年6月18日,Go语言Go 1.3版发布。
- 2014年12月10日,Go语言Go 1.4版发布。
// 2015年8月19日,Go语言Go 1.5版发布,本次更新中移除了”最后残余的C代码”。
go1.5的发布被认为是历史性的。完全移除C语言部分,使用GO编译GO(ps:少量代码使用汇编实现),GO编译GO称之为Go的自举,是一门编程语言走向成熟的表现。另外,他们请来了内存管理方面的权威专家Rick Hudson,对GC进行了重新设计,支持并发GC,解决了一直以来广为诟病的GC时延(STW)问题。并且在此后的版本中,又对GC做了更进一步的优化。到go1.8时,相同业务场景下的GC时延已经可以从go1.1的数秒,控制在1ms以内。GC问题的解决,可以说GO语言在服务端开发方面,几乎抹平了所有的弱点。
- 2016年2月17日,Go语言Go 1.6版发布。
- 2016年8月15日,Go语言Go 1.7版发布。
- 2017年2月17日,Go语言Go 1.8版发布。
- 2017年8月24日,Go语言Go 1.9版发布。
- 2018年2月16日,Go语言Go 1.10版发布。
- 2018年8月24日,Go语言Go 1.11版发布。
- 2019年2月25日,GO语言Go1.12版发布。
ps:在GO语言的版本迭代过程中,语言特性基本上没有太大的变化,基本上维持在GO1.1的基准上,并且官方承诺,新版本对老版本下开发的代码完全兼容。事实上,GO开发团队在新增语言特性上显得非常谨慎,Go语言的版本更迭主要集中在稳定性、编译速度、执行效率以及GC性能等底层性能方面,所以说Go语言使用者不必担心快速的版本更迭带来的兼容性问题
Go语言这两年在语言排行榜(https://www.tiobe.com/tiobe-index/)增长曲线如下,总体还是处于上涨趋势的