写在前面
Go语言最近几年发展非常火爆,很多大公司都将Go语言应用到了其核心业务系统中。这些公司包括:
- 国外:
- Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司
- 国内:
- 阿里云CDN、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司
甚至有人断言“Go语言将制霸云计算领域”,那么GoLang到底牛在哪里呢?作为一个有Java背景的程序员,应该如何学习Go语言呢?本系列文章由此而生。
Go语言概览
本文为Java程序员学习Go语言系列文章的第一篇,从总体上对Go语言的历史,优势,目前的缺点进行概括性介绍。
部分内容引用了EGO会员谢孟军(@astaxie)在一次EGO内部活动中所分享的内容。链接在这里:我为什么选择使用Go语言?
1. 发展时间线
其实看看各版本的Release Notes,可以比较详细的了解Go语言的发展过程
2015年8月,Go发布了一次重大更新,Go1.5,在这个版本中,Go极大改进了之前被人诟病的GC延时问题,随着16年发布Go1.6版本对GC问题的进一步改进,可以说,从Go1.6之后,GC已经基本上不是Go的问题了。
下图是从1.4到1.5,GC Pause从300ms降到40ms
从1.5到1.6,GC Pause从40ms降到了2ms
2. 语言的由来
讲到Go为什么这么牛,就不能不提Go的作者和主要参与者
看看这些作者和Go的主要参与者,过往都干了什么,你就知道他们有多牛了。而“一群牛人做出来的Go也一定够牛”!
那么问题来了,这几个老哥们是闲的没事干了么?为啥要整个新语言出来呢?接下来,咱们看看设计Go语言的原因,以及这么牛的Go语言都有哪些特性。
- 设计Go语言是为了解决当时Google开发遇到的以下这些问题:
- 大量的C++代码,同时又引入了Java和Python
- 成千上万的工程师
- 数以万计行的代码
- 分布式的编译系统
- 数百万的服务器
- 主要有以下几个方面的痛点:
- 编译慢
- 失控的依赖
- 每个工程师只是用了一个语言里面的一部分
- 程序难以维护(可读性差、文档不清晰等)
- 更新的花费越来越长
- 交叉编译困难
3. Go的优势与劣势
我有一个哥们,他们公司原来需要几十台机器才能支撑的业务,采用了Go重写后,只需要几台机器即可满足,这一点对于企业来讲是非常重要的。
- Go的主要特色:
- 没有继承的OO
- 强一致类型
- Interface但是不需要显示申明(Duck Type)
- Function 和 Method
- 没有异常处理(Error is value)
- 基于首字母的可访问特性
- 不用的Import或者变量引起编译错误
- 完整而卓越的标准库包
当然,作为一门新兴语言,Go目前也还存在着一些缺点:
- Go的goroutine一旦启动后,不同的goroutine之间切换不是受程序控制,runtime调度的时候需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了却突然冒出来又执行了,这会导致逻辑出错等情况。这个目前无解,应该属于调度器的优化。
- pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。
- GC延迟有点大,但是在1.6版本后,已经得到了解决。
相信随着Go语言的发展,这些问题都将不是问题。
4. Go的主要应用场景
- 目前Go主要应用在下面这些系统:
- 服务器编程
以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。 - 分布式系统、数据库代理器等
例如Etcd。 - 网络编程
这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。 - 数据库
Google开发的Groupcache,Couchbase的部分组件,Tidb,Cockroachdb,Influxdb等。 - 云平台
目前国外很多云平台在采用Go开发,CloudFoundy的部分组件,前VMvare的技术总监自己出来搞的Apcera云平台。
最后,借用谢孟军的总结,给出选择Go的八个理由:
- 学习曲线
它包含了类C语法、GC内置和工程工具。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。 - 效率
Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。 - 出身名门、血统纯正
之所以说Go出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了。 - 自由高效
组合的思想、无侵入式的接口 Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。 - 强大的标准库
这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。 - 部署方便
二进制文件、Copy部署 我相信这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。 - 简单的并发
它包含了降低心智的并发和简易的数据同步,我觉得这是Go最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单。 - 稳定性
Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test
以上八点,是谢大牛的总结,我们可以在后面的学习中继续体会。