为什么2017年你必须学习Go语言?
Posted StuQ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么2017年你必须学习Go语言?相关的知识,希望对你有一定的参考价值。
作者|方圆、asta 谢
编辑|Emily
Go语言最初由Robert Griesemer, Rob Pike和Ken Thompson在2007年末共同设计和实现,2009年11月份正式发布并开源,当它全部开源出来后,获得了当年的年度语言。Go稳定发布是,Go Team 承诺后续的版本都会兼容之前的版本,并于2012年3月份发布了1.0版本以及Go1规范。
从左到右分别是Robert Griesemer, Rob Pike和Ken Thompson
Robert在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-8、plan9的作者;Ken主要是B语言、C语言的作者、Unix之父。
当初他们为什么会有设计一个新语言的冲动呢?让我们一起来回顾一下这些历史,也许很多人对他们当年遇到的问题感同身受。
设计Go语言是为了解决当时Google开发遇到的以下这些问题 :
大量的C++代码,同时又引入了Java和Python
成千上万的工程师
数以万计行的代码
分布式的编译系统
数百万的服务器
其主要有以下几个方面的痛点:
编译慢
失控的依赖
每个工程师只是用了一个语言里面的一部分
程序难以维护(可读性差、文档不清晰等)
更新的花费越来越长
交叉编译困难
所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。
但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,C语言虽然在系统编程以及服务端编程方面很强大,但是C的语法“陷阱”和C手工内存管理给开发者带来较大苦恼。虽然那些年市面上也有其他主流语言可供选择,但同时给开发者带来的心智负担太过沉重,比如:C++“宇宙无敌”的学习和使用复杂性、Java超大的资源消耗和庞大且纷繁芜杂的框架体系、动态语言(ruby、python)无静态类型而导致运行时crash时调试的困难、函数式语言(如Haskell、clisp)的过于小众和非主流。
直到Go的出现,所以新设计的语言一定要易学习,最好是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主要应用在下面这些系统:
服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
分布式系统、数据库代理器等,例如Etcd。
网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
数据库,前一段时间Google开发的Groupcache,Couchbase的部分组建,Tidb,Cockroachdb,Influxdb等。
云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的Apcera云平台。
那么目前Go还存在哪些缺点呢?以下是我自己在项目开发中遇到的一些问题:
1、Go的Import包不支持版本,有时候升级容易导致项目不可运行,所以需要自己控制相应的版本信息。比较好的现象是从Go 1.5开始Go对此就有重视了并支持Vendor。
2、Go的goroutine一旦启动后,不同的goroutine之间切换不是受程序控制,runtime调度的时候需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了却突然冒出来又执行了,这会导致逻辑出错等情况。这个目前无解,应该属于调度器的优化。
3、GC延迟有点大,我开发的日志系统伤过一次,同时在并发很大的情况下,处理很大的日志,GC没有那么快,内存回收不给力,后来经过Profile程序改进之后得到了改善。目前来看,GC已经优化的非常好了,给大家看一下Go1.5、Go1.6的GC前后对比图。
图3是Go1.4升级到Go1.5之后的效果,从300ms到了50ms左右。
图4是从Go1.5升级到Go1.6,从40ms到了2ms左右,可以说目前GC基本上不是Go的问题了。
4、pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。
国内很多云创业公司都会选择把Go作为首要语言,例如DaoCloud。为什么会选择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。
这里引用知乎里一个同学对Go评论的话:最开始准备上线的时候其实心里挺忐忑,毕竟一旦出现故障,不仅黑锅得自己背,面子也上过不去啊。还好结果蛮漂亮,自上线后没出现过一次突发性BUG,降低运维难度的同时还减少了机器的负载。我相信这也是大多数人用了Go之后的感言。
GopherChina 大会即将在4.15 - 4.16 在上海小举办,GopherChina大会是国内最大最专业的Go大会,聚集了全中国各地的Gopher一起分享交流,大会希望通过大家线上线下的交流,讲师的分享,让大家能够了解目前Go动态,应用场景,技术细节等。
本次 GopherChina 2017 由StuQ独家直播,不能去到上海参会的伙伴们可通过直播实时收看本次 Gopher 大会。文章末尾「 阅读原文 」 可直接报名。
这次的 GopherChina 2017 都有哪些大神级别的Golang语言开发者?
Golang使用者?
Golang布道师?
让我们一睹为快!
点击「 阅读原文 」,一键报名!
以上是关于为什么2017年你必须学习Go语言?的主要内容,如果未能解决你的问题,请参考以下文章
为什么说 2017 年你必须要学习 Go 了(多核,网络,多人协作,简单非OO,没有注解,Native,垃圾收集,代码优雅),附两个评论