写在前面

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. 发展时间线

go语言人力资源管理系统 go语言公司_GoLang

其实看看各版本的Release Notes,可以比较详细的了解Go语言的发展过程

go语言人力资源管理系统 go语言公司_Google_02

go语言人力资源管理系统 go语言公司_GoLang_03

2015年8月,Go发布了一次重大更新,Go1.5,在这个版本中,Go极大改进了之前被人诟病的GC延时问题,随着16年发布Go1.6版本对GC问题的进一步改进,可以说,从Go1.6之后,GC已经基本上不是Go的问题了。

下图是从1.4到1.5,GC Pause从300ms降到40ms

go语言人力资源管理系统 go语言公司_Java_04

从1.5到1.6,GC Pause从40ms降到了2ms

go语言人力资源管理系统 go语言公司_Go_05

2. 语言的由来

讲到Go为什么这么牛,就不能不提Go的作者和主要参与者

go语言人力资源管理系统 go语言公司_GoLang_06


go语言人力资源管理系统 go语言公司_Java_07

看看这些作者和Go的主要参与者,过往都干了什么,你就知道他们有多牛了。而“一群牛人做出来的Go也一定够牛”!

那么问题来了,这几个老哥们是闲的没事干了么?为啥要整个新语言出来呢?接下来,咱们看看设计Go语言的原因,以及这么牛的Go语言都有哪些特性。

  • 设计Go语言是为了解决当时Google开发遇到的以下这些问题:
  • 大量的C++代码,同时又引入了Java和Python
  • 成千上万的工程师
  • 数以万计行的代码
  • 分布式的编译系统
  • 数百万的服务器
  • 主要有以下几个方面的痛点:
  • 编译慢
  • 失控的依赖
  • 每个工程师只是用了一个语言里面的一部分
  • 程序难以维护(可读性差、文档不清晰等)
  • 更新的花费越来越长
  • 交叉编译困难

3. Go的优势与劣势

我有一个哥们,他们公司原来需要几十台机器才能支撑的业务,采用了Go重写后,只需要几台机器即可满足,这一点对于企业来讲是非常重要的。

  • Go的主要特色:
  • 没有继承的OO
  • 强一致类型
  • Interface但是不需要显示申明(Duck Type)
  • Function 和 Method
  • 没有异常处理(Error is value)
  • 基于首字母的可访问特性
  • 不用的Import或者变量引起编译错误
  • 完整而卓越的标准库包

当然,作为一门新兴语言,Go目前也还存在着一些缺点:

  1. Go的goroutine一旦启动后,不同的goroutine之间切换不是受程序控制,runtime调度的时候需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了却突然冒出来又执行了,这会导致逻辑出错等情况。这个目前无解,应该属于调度器的优化。
  2. pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。
  3. 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的八个理由:

  1. 学习曲线
    它包含了类C语法、GC内置和工程工具。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。
  2. 效率
    Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。
  3. 出身名门、血统纯正
    之所以说Go出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了。
  4. 自由高效
    组合的思想、无侵入式的接口 Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。
  5. 强大的标准库
    这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。
  6. 部署方便
    二进制文件、Copy部署 我相信这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。
  7. 简单的并发
    它包含了降低心智的并发和简易的数据同步,我觉得这是Go最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单。
  8. 稳定性
    Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test

以上八点,是谢大牛的总结,我们可以在后面的学习中继续体会。