Go将统治下一个10年?Go语言发展现状分析

"本文是国内Go语言大中华区首席布道师--许式伟,在QCon 2015 上海站上的分享。他预测Go语言10年内一定会超过C和java,并且统治这一个10年。Go语言语法及标准库变化

Go从1.0版本到现在(2015年)已经有三年多的时间,大的版本发布了五个,下面大家一起看看每个大版本分别都改了什么,当然这里不可能把所有的细节都提到,但我认为重要的会提出来。

首先是Go 1.1,Go 1.0于2012年4月发布,此后基本维持了每半年发布一个新版本的时间间隔。Go 1.5比较例外,在Go 1.5的拖累下,Go并没有坚持半年发布一个版本的惯例,因为Go 1.5的变化非常大。大家如果对Go有所了解,就会知道Go 1.5将基础的实现用Go语言重新写了一遍,但之前是用C写的。

Go 1.1是Go 1.0之后比较大的版本,相对于后面几个版本而言,里面有更多的语法变更。例如,它最重要的功能是支持方法值,如有一个Foo类型,假设里面有个写的方法,我直接定义一个p的变量,就是访问了这个函数,等价于一个闭包、并调用 p.Write( ),相当于把第一个参数直接通过p绑定了。有点类似闭包,假设N个变量,少了一个就变成了N-1,第一个参数绑定一个就变成了一个新的闭包。这样的好处是,Go里面大量的函数有上下文,p.Write方式非常适合代入上下文,而且是非常优雅的。

区别于方法表达式(*Foo).Write,结果类型为func(p *Foo, b[]byte)(int, error),方法表达式非常简洁,而且容易理解。

另外,Go 1.1的改进还包括int、uint类型长度调整。自Go 1.1后,int、uint的尺寸统一是64位(即使在32位平台下)。Go 1.1的编译条件也有变化,需要在Go 1.1或以上的版本编译。

Go 1.1相比后面的版本,除语法变化比较巨大外,还做了很多性能的优化。如:

更多内联,如Append,接口类型转换;

全新实现了Map,更小的内存占用和CPU开销;

网络库性能优化,减少了上下文切换;

在标准库/工具上面,Go 1.1将一些尚未稳定的库从标准库中移除,迁移到code.google.com/p/go.exp或code.google.com/p/go.text中,并新增go/format、net/http/cookiejar、runtime/race等包。

Go 1.2语法增加了三下标切片(Three-index slices):arry[begin:end:endcap];cgo支持了C++,另外做了一些标准库compress/bzip2、crypto/dex、encoding/json等性能优化。很重要的是,Go 1.2增加了测试覆盖率。

Go 1.3,该版本几乎没有语法变化,更多的是实现细节的变化,尤其是GC。最早期的Go被诟病最多的就是GC,这和Go的策略有关系,Go较强调编程范式的稳定。和大家平常做项目一样,需要研发稳定下来的是模块之间的接口,语言的编程范式相当于大家交互的接口,该接口如稳定不下来,对后面的迭代非常有害。所以在Go 1.3的版本中,有做大量针对GC的调整,基本上做了小范围的重写。

Go在1.3之前有大量的C代码,所以它的GC其实是经验性的,如果某个整数的值恰巧是一个合法的指针,那么它会被当做一个指针来处理,这样会导致一些内存本来应该释放,当时为了安全不释放,有了这样的经验性,大部分情况已经够用。Go 1.3调整为精确GC,这会导致以前的编程手法失效。即如果有人意图把指针存储到uintptr而不是unsafe.pointer,那么这块内存无法保证不被回收;使用unsafe.pointer存储整数也不会是一个好主意,因为这会干扰GC对真相的理解。

在Map的遍历次序上,Go 1.3也做了调整,Go1标准指出,对Map的多次遍历不应该假设有同样的次序,为了避免这样的假设发生,Go 1.0遍历Map选择起点时用了随机数。Go 1.1重新实现Map后,小Map的遍历没有引入随机数,Go 1.3重新引入,以消灭此类潜在Bug。

cgo在Go 1.3中也有变化,类型不再允许跨包访问。例如,如果某个函数有 *C.FILE 参数,那么这个函数无法在其他包中使用(会编译失败),如果认为此代码是合理的,可将其调整为unsafe.pointer。

性能方面,Go 1.3大大降低了defer的内存开销;引入并行GC算法,大幅改善GC 效率;竞争检测算法(race detector)大幅提速;优化regexp包,改善大部分简单正则表达式的性能。在标准库/工具上,Go 1.3新增了debug/plan9obj包。

Go 1.4的变化看似很多,但大部分都无关痛痒。它增加了一种非常小概率使用的 forrange语法;不再自动对 **T 进行解引用(dereference);引入internal package概念;引入 canonical import paths(权威导入路径)概念。实现细节上,它开始支持安卓(编译出binary或.so);运行时(runtime)大部分用Go重写(以前是C),使得GC更加精确,同时,运行时放弃了分段栈(segmented stack)。

Go 1.5在语法上,Map字面量化写法做了变更;实现细节上,它把所有对C的依赖全部消除掉,不需要新的编译器去编Go的代码,只需要用Go的编译器,所以1.5以后编译Go的代码必须用Go,这是一个很重要的变化;GC被重写,进一步降低了GC的latency;GOMAXPROCS默认是调整为CPU数(以前是1);另外,Go 1.5开始支持iOS,为此Go team还提交了第一个Go写的AppStore应用lvy。

Go语言演进回顾

根据Go语言的几个版本,这里总结一下它的演进。

语法变化:几乎没有增加什么明显的语法特性,变化主要围绕:降低心智负担、细节完善、工程化;

Go本身迭代的核心是实现优化,主要围绕:性能、性能、性能!(重要的事情说三遍),性能的优化尤其体现在GC上,此外,还围绕更多的平台移植及更进一步的标准化,以强化社区约定。

Go和Java不一样的地方在于,Go保留了比较大的灵活性的因素。我个人对Go语言未来有这样的判断:Go介于Java和很多灵活性的语言之间。Go的语言特性,三年虽然发布了五个大版本,但其实没有什么语言的实质性变化,我见到有人喷Go时,认为Go语言太不思进取了,也有人认为Go社区对好的想法不思进取、不愿意吸收。

我认为其实不然,不止三年,哪怕是十年,Go语言的语法变化也别指望有大的改进,它基本上只会修补一些很小的地方,我觉得与其说是不思进取,不如说是它对如何写好代码这样的需求理解的自信,这是其他语言远不能企及的,也是我对Go最佩服的地方。

我为什么选Go?并不是因为Go有多好,七牛是做云服务的,云服务特别依赖并行支持,而Go可能是这世界上对并行支持的先行者。

最早七牛用Go的时候,Go 1.0还未发布,我当时对语法变化的判断不是特别高,这自信有点类似C,C到现在已经十几年了,但C到现在变过吗?几乎没什么改变,哪怕有C 99之类的,变化都很小。Go语言的想法和C很类似,我觉得很难预期 Go的语法特性变化很剧烈,但这恰恰是这个语言发展的魅力所在,因为你不用担心你写的代码三十年后会过时。从某种意义上讲,这是一种自信,它已经知道这个世界未来就应该这个样子。

Go语言的研究方向

大家都很关心Go语言未来会如何发展,我觉得三到五年内Go语言的主攻方向仍然是服务端开发,这不会有太大的变化。比如内建HTTP 2.0的支持(更多的支持会以独立的开源库的方式提供,未必直接包含在Go的发布包);另外,尽管Go已经开始支持桌面端(Mobile)的开发,但这仍然是探索性和试验性的,如果站在10年的维度上,Go语言会在桌面端(Mobile)大放异彩,占据重要地位。

很有意思的是,全球对Go最感兴趣的是中国,进一步来讲其实是华人,为什么?因为对Go感兴趣排第二的是香港,第三是新加坡,这些地方都是华人聚集地,所以Go语言在中国发展或者在华人圈发展非常不错,比在美国本土还牛很多(当然这仅仅是搜索,其实我是开玩笑的)。从开源项目的角度看,Go在国外发展的其实非常好,刚才所讲的语法特性,大家觉得发展好像很慢,但其实不然,因为它在1.0的时候就把后面的所有做的事情都想好了,后面所要做的就是优化。

下面关于Go,有一些公开的预测:

第一个预测,我最早在2012年新浪微博里提过,Go语言10年内一定会超过C和Java,变成排行榜第一的语言。今天大家可能会略相信,但在2012年的时候没有多少人会相信,即使今天讲出来,绝大部分人都会觉得太早,毕竟它还没有排进前五。

第二个预测,Go语言将在两年内制霸云计算领域。

第三个预测,Go将统治下一个 10 年。(来自于Deferpanic创始人Lan Eyberg)。

接下来一个问题,非技术人怎么看Go?第一是国外的投资人怎么看Go,我觉得国外的投资人和中国投资人不一样,他们挺技术范儿的,他们认为"开源的Go语言将成为最持久、最有广泛影响力的开源系统之一"。另外,有商务开发人士认为,"这个世界上好像几乎所有新的、有趣的项目都是用 Go写的"。

Go语言开源项目介绍

Go语言的开源项目非常多,而且绝大部分和云计算相关,我这里大致把它分为几类:一类和容器相关,第二类与微服务相关,第三类是数据库类。这三类都是基础设施,以前,大家可能认为基础设施就是操作系统、数据库,但今天的基础设施是什么?数据库和OS依然是,但云服务IaaS、PaaS也是。

大家可以看一下数据库,以前它们都是用C、C++写的(绝大部分最优广泛影响的都是用C写的),但你能想到的数据库并不多。今天,大家能看到的用Go写的数据库有多少?非常多,有键值对的、有时间序列的,还有cockrouchdb(名为小强,因为无论发生什么情况,它都不会死)等。

所以,我们今天看到,基础设施的定义已经发生了变化,实现基础设施最好的方式也发生了变化,不再是以前大家所认为的那样,系统级的东西一定是C开发的,而今天绝大部分新兴的云基础设施(甚至可以认为几乎全部都是)都是Go语言开发的。

那么,Go语言到底发展的怎么样?从Go对自己的定位来讲,它一直关注在服务端开发,服务端开发和今天的主题"云计算时代"有着非常密切的关系,Go想成为云计算时代的核心,成为大家最广泛使用的语言,从某种意义上来讲,它已经达到了。

延展阅读(点击标题):

你天天低头写代码,却未必知道什么在驱动软件开发?

在线支付事故频发,风控系统真的靠谱?

前Facebook早期员工:我是如何肉身翻墙,又回国创业的?| 大咖说回放

号外!号外!

阿里巴巴CTO王坚加入GTLC,全球技术领导力峰会讲师阵容再添重磅嘉宾!想一睹王坚博士风采吗?想在现场倾听他的技术领袖之道吗?就在8月GTLC全球技术领导力峰会!

本文系InfoQ原创首发,未经授权谢绝转载。

「点点赞赏,手留余香」

赞赏

  • 猫猫澈
  • 读儒来
  • 惜可缘
  • 贝占口巴大神竟
  • 黑武士绝剑
  • 5人赞过
5
0
0
评论 0 请文明上网,理性发言

相关文章

  • "谢孟军:EGO会员、GopherChina组织者、《GoWeb编程》一书的作者,专注Golang技术架构。本文来自EGO会员群分享,入群方式见文末在这里我主要想和大家分享一些Go和我个人的成长史。首先聊聊Go,在2009年全部开源出来后,它获得了当年的年度语言,但是直到2011年它才发布正式的稳定版本。Go稳定版发布
    萌萌蔷 4 0 0 条评论
  • 前言 曾经我是一名以Java语言为主的开发者,做过JavaWeb相关的开发,后来转Android,还是离不开Java,直到转去做大前端了,其实也就是一直在用JS写业务。如今由于个人发展原因,来到阿里云,由于项目需要就撸起了Go语言;多年编程经验告诉我,语言只是工具罢了,重要的还是其思想与逻辑,所以只需学学语法就好了,
    2017xz 4 0 0 条评论
  • 作者|郝林 编辑|小智 本篇文章是Go语言2018年终盘点,力求客观、深入分析2018年Go语言的技术发展现状,同时对明年可能的发展情况进行预测和展望。 今年真可谓是不平静的一年,前有人工智能国家级战略的发布,行业已经在大跨步的挺进,但人才缺口每天都在扩大;后有区块链技术从爆发式增长到大幅回落,无数程序员蜂拥而至,
    身挂音 3 3 0 条评论
  • 来源|后端技术指南针(ID:gh_ed1e2b37dcb6) Go语言的巨大潜力有目共睹,今天我们来学习Go语言的Goroutine机制,这也可能是Go语言最为吸引人的特性了,理解它对于掌握Go语言大有裨益,话不多说开始吧! 通过本文你将了解到以下内容: 什么是协程以及横向对比优势Go语言的Goroutine机制底层
    西邦3jk9 7 0 0 条评论
  • 近日,HackerNews发布了2018年7月的编程语言招聘趋势排行榜,其中,Go语言已经反超Java进入了前三名的行列。从浅绿色的Go语言走势图可以看出来,企业对于Go语言的采用情况在逐年上升。 从公司角度看,许多大厂都已经开始拥抱Go语言,包括以Java打天下的阿里巴巴,更别提深爱着Go语言的滴滴、今日头条、小米、
    愿为栽树前人 3 0 0 条评论
  • 作者|白明的赞赏账户责编|欧阳姝黎 本文翻译自JohnArundel的《TencommandmentsofGo》[1]。全文如下: 作为一名全职的Go语言作家[2]和老师[3],我花了很多时间和学生们一起,帮助他们写出更清晰、更好、更有用的Go程序。我发现,我给他们的建议可以归纳总结为一套通用原则,在这里我将这些原则
    ljljjl射手 6 3 0 条评论
  • Go官方博客今天发布了2018年Go语言调查报告。参与本次调查的5883名受访者来自103个不同的国家,官方表示,这些受访者的反馈意见将被选取用于改进Go语言的发展。 知道大家都很忙,先直接看一下调查报告摘要: 首次有一半的受访者表示Go是他们日常使用的编程语言之一。此外,在工作中用到Go语言以及在工作之余使用Go语言
    Zuepv54 3 1 0 条评论
  • 译文:Golang新手可能会踩的50个坑原文:50ShadesofGo:Traps,Gotchas,andCommonMistakes翻译已获作者授权,转载请注明来源。 不久前发现在知乎这篇质量很高的文章,打算加上自己的理解翻译一遍。文章分为三部分:初级篇1-34,中级篇35-50,高级篇51-57 前言Go是一门简单
    近水楼台先得磊 7 0 0 条评论
  • 关注"脚本之家",与百万开发者在一起 出处:捉虫大师(ID:gh_562cbc6dd343) 作为一名比较新的编程语言,golang的这些工具是否更加好用呢? 单元测试Java的单元测试需要使用第三方库,一般是Junit,配置起来比较复杂。在使用了golang之后发现golang自带的单元测试真的非常简单。 如果我们
    一掷决生死N 6 3 0 条评论
  • 作者:trumanyan,腾讯CSIG后台开发工程师 项目背景网关服务作为统一接入服务,是大部分服务的统一入口。为了避免成功瓶颈,需要对其进行尽可能地优化。因此,特别总结一下golang后台服务性能优化的方式,并对网关服务进行优化。 技术背景: 吞吐量:每秒钟可以处理的请求数响应时间:从客户端发出请求,到收到回包的总耗
    你不知道旳事和 8 2 0 条评论