why go

取自:http://www.weixinyidu.com/n_3502636程序员

 

Go的核心贡献者数据库

Go主要有静态语言、天生并发、内置GC、安全性高、语法简单、交叉编译和编译快速这几个方面的特性。这些特性决定了Go的三个高富帅特性:运行快、开发快和部署快,而这些特性都是针对Google遇到的一些痛点来设计的。编程

图1安全

在说痛点以前,咱们先来了解一下Go的做者和主要核心开发者们,图1是Go的三个做者从左到右分别是:Robert Griesemer, Rob Pike 和 Ken Thompson。Robert在开发Go以前是Google V八、Chubby和HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-八、plan9的做者;Ken主要是B语言、C语言的做者、Unix之父。服务器

图2网络

再来看看其余核心贡献者,图2中Russ Cox也是目前Go的领导者之一,他和Rob Pike一块儿领导Go;Ian Lance Taylor是GCC的做者之一,目前负责GCC的Go实现;Brad Fitzpatrick以前是Memcache的做者,目前主要是HTTP2的实现做者。你们能够看到这些做者都是各个领域内的顶尖高手,因此当初我相信一群牛人作出来的Go也必定够牛。架构

为何会设计Go语言?并发

当初他们为何会有设计一个新语言的冲动呢?让咱们一块儿来回顾一下这些历史,也许不少人对他们当年遇到的问题感同身受。运维

设计Go语言是为了解决当时Google开发遇到的如下这些问题:编程语言

  • 大量的C++代码,同时又引入了Java和Python

  • 成千上万的工程师

  • 数以万计行的代码

  • 分布式的编译系统

  • 数百万的服务器

其主要有如下几个方面的痛点:

  • 编译慢

  • 失控的依赖

  • 每一个工程师只是用了一个语言里面的一部分

  • 程序难以维护(可读性差、文档不清晰等)

  • 更新的花费愈来愈长

  • 交叉编译困难

因此,他们当时设计Go的目标是为了消除各类缓慢和笨重、改进各类低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它仍是为了让咱们的编程变得更温馨和方便。

可是结合Google当时内部的一些现实状况,如不少工程师都是C系的,因此新设计的语言必定要易学习,最好是C-like的语言;由于有太多的分布式系统、太多的开发者,因此新的语言必定要能够Scale,这个包括开发、工程师、代码、部署和依赖;20年没有出新的语言了,因此新设计的语言必须是现代化的(例如内置GC)等状况,他们以为要实现这个目标就须要Go成为一个你们都承认的语言。

最后根据实战经验,他们向着目标设计了Go这个语言,其主要的特点有:

  • 没有继承的OO

  • 强一致类型

  • Interface可是不须要显示申明(Duck Type)

  • Function 和Method

  • 没有异常处理(Error is value)

  • 基于首字母的可访问特性

  • 不用的Import或者变量引发编译错误

  • 完整而卓越的标准库包

Go发布以后,不少公司特别是云计算公司开始用Go重构他们的基础架构,不少都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。咱们来看看目前为止采用Go的一些国内外公司,国外的如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司,国内的如阿里云CDN、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。

Go主要应用的系统

上面那些基本上就是Go的历史背景和设计初衷,那么目前Go主要应用于哪些系统呢?

就我知道的来讲,目前Go主要应用在下面这些系统:

  1. 服务器编程,之前你若是使用C或者C++作的那些事情,用Go来作很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。

  2. 分布式系统、数据库代理器等,例如Etcd。

  3. 网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,并且Go内置的net/http包基本上把咱们日常用到的网络功能都实现了。

  4. 数据库,前一段时间Google开发的Groupcache,Couchbase的部分组建,Tidb,Cockroachdb,Influxdb等。

  5. 云平台,目前国外不少云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监本身出来搞的Apcera云平台。

为何选择使用Go语言?

国内不少云创业公司都会选择把Go做为首要语言,例如DaoCloud。为何会选择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。

这里引用知乎里一个同窗对Go评论的话:最开始准备上线的时候其实内心挺忐忑,毕竟一旦出现故障,不只黑锅得本身背,面子也上过不去啊。还好结果蛮漂亮,自上线后没出现过一次突发性BUG,下降运维难度的同时还减小了机器的负载。我相信这也是大多数人用了Go以后的感言。

那么目前Go还存在哪些缺点呢?如下是我本身在项目开发中遇到的一些问题:

1.Go的Import包不支持版本,有时候升级容易致使项目不可运行,因此须要本身控制相应的版本信息。比较好的现象是从Go 1.5开始Go对此就有重视了并支持Vendor。

2.Go的goroutine一旦启动后,不一样的goroutine之间切换不是受程序控制,runtime调度的时候须要严谨的逻辑,否则goroutine休眠,过一段时间逻辑结束了却忽然冒出来又执行了,这会致使逻辑出错等状况。这个目前无解,应该属于调度器的优化。

3.GC延迟有点大,我开发的日志系统伤过一次,同时在并发很大的状况下,处理很大的日志,GC没有那么快,内存回收不给力,后来通过Profile程序改进以后获得了改善。目前来看,GC已经优化的很是好了,给你们看一下Go1.五、Go1.6的GC先后对比图。

图3

图3是Go1.4升级到Go1.5以后的效果,从300ms到了50ms左右。

图4

图4是从Go1.5升级到Go1.6,从40ms到了2ms左右,能够说目前GC基本上不是Go的问题了。

4.pkg下面的图片处理库不少bug,仍是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样能够很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。

相关文章
相关标签/搜索