万丈高楼平地起|初识Go语言

后端技术指南针 · · 3294 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

0.前言

从1月19号到今天已经12天没有更新文章了,这个春节显得格外特殊,突如其来的疫情打乱了我们的生活和工作。

特殊时期我们可以积极转发有效信息、减少外出、避免出入拥挤场所、劝导家人朋友重视疫情保护自身、多陪伴父母家人共克时艰。

北京窗外的阳光似乎还不错,很怀念之前自由自在的感觉,由衷希望早一天战胜疫情,大家摘掉口罩走上街头,露出灿烂脸庞,像往日一样拥抱自由,拥抱阳光。

言归正传,之前计划写的TCP/IP协议栈系列文章再次跳票,但是大白准备双线作战再开一个Go语言专题,后续会推出系列文章,慢慢来大家也别急, Go is the way to go!

说实话,大白水平有限写个21天玩转系列确实搞不定,要写个210天玩转我觉得比较有戏。所谓兵马未动粮草先行,图为大白之前买的关于Go语言的书,还比较新:

                        

今天算是第一篇初识Go语言,通过本文你将了解到以下内容:

  • 为什么要学习Go语言
  • Go语言的发展历史和前景
  • Go语言的杀手锏特性

1.学习Go语言的理由

1.1 一些习惯

做一件事之前先思考为什么要去做这件事情以及做这件事情的收益是什么,是很重要的。

当然在工作中我们大头兵很多时候都没有太多话语权并且信息不对称,以致于整个事情的穿透力不足,让人觉得参与感很低,甚至很多时候都是在试错,不停地试错才让人惊慌。

学习一门新技能也是如此,接受新技艺是为了提高工作效率,并且为后续的维护和优化少埋雷少挖坑,清清爽爽地平衡工作和生活。

所以面对一门新的语言,我们有理由且必须要去问为什么,这样才更有动力。

1.2 Go的地盘

我们从几个方面来看Go的应用领域和受追捧程度,这样更加有说服力。

  • Go语言特性

Go是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。

Go语言是谷歌推出来的,团队实力毋庸置疑,为了展示Go的威力,谷歌在自家的诸多产品中都使用了Go,俨然是谷歌的亲儿子的感觉,在2016年Go被TIOBE 选为2016 年最佳语言。

Go内置了丰富的库,在语言层面支持并发、简单易上手、代码规范化、开发效率高、性能强悍、拥有自己的生态系统、很多常用工具软件的客户端都对Go有支持、静态编译型语言部署简单、完备的工具链等。

特别地,中国在Go语言的推广和应用过程扮演了非常重要的角色,Go的主要作者Rob Pike对Go中国社区给予非常高的评价:

Go is huge in China.
  • Go与云时代

在互联网的云时代我们耳熟能详的Docker、Kubernetes正是基于Go语言构建的,因此Go语言是云计算和云存储的重要组成部分。

  • Go与区块链

区块链底层系统的主流开发语言主要包括C++/Python/Go/Rust等,早期的一些区块链项目一般基于C++开发,随着Go的发展有很多项目基于Go展开,最近的Rust也有一席之地。

Go由于其开发效率和性能、简单易用的设计哲学、快速实现的便利和优势在区块链开发中备受关注,区块链2.0的以太坊,区块链3.0的超级账本都是使用go语言实现的,如图为各个语言以及其完成的区块链项目的简单概况:

                                                         图片来自网络
  • Go与国内公司

国内先行者是七牛云,随着Go语言的发展国内几乎所有叫得上名字的公司都在使用Go进行新业务开发和老业务重构,国内外部分业务案例:

                                                        图片来自网络

以百度为例:百度的七层流量转发平台BFE(统一接入前端)使用go开发,目前已经接入了百度的大部分业务流量,单日转发量1w亿次、峰值QPS1000w,具有研发效率高、系统安全性好等特点,目前已经开源。

  • Go与开源项目

etcd 可靠的分布式kv数据库 目前Star29k+
go-cache 单机缓存框架 目前Star3.4k
go-leveldb 使用go实现的leveldb数据库 目前Star3.5k
ledisdb 基于LevelDB的类Redis数据库 目前Start3.2k

其中豌豆荚的Codis作为国内先于官方推出的Redis集群解决方案也是基于Go开发的:

还有很多优秀的开源项目,可以参考知乎上的一个问题来查看相关开源项目

有哪些值得学习的 Go 语言开源项目?www.zhihu.com/question/20…

2.0 Go语言简史

我们从Go的创造过程、版本更迭、社区生态等角度来看Go语言,相信这样我们才能更深入了解Go的设计思想和使用前景。

2.1 Go语言的创造者们

谷歌的Rob Pike罗伯.派克,Ken Thompson肯.汤普森和Robert Griesemer罗伯特.格利茨默在2007年开始设计Go语言。

网上说Go设计的源动力是对于一场关于C++11报告的思考,面对C++11复杂的特性大牛们表示出了失望,于是想设计一门新的语言来适应网络和多核时代,让开发更快捷更有趣。

如图从左到右依次为:Robert Griesemer罗伯特.格利茨默、Rob Pike罗伯.派克、Ken Thompson肯.汤普森

                                                               图片来自网络

Rob Pike来自加拿大出生于1956年,毕业于多伦多大学和加州理学院,曾经为贝尔实验室Unix小组成员,期间参与过plan9、Inferno、编程语言Limbo等项目的开发,他与肯·汤普逊共同开发了UTF-8,目前为google的工程师,参与编程语言Go与Sawzall的研发工作。

Rob Pike除了是个全能程序员,还是一位业余天文学家,发明过珈玛射线射电望远镜,同时他还参加了1980年的奥运会射箭项目并夺得银牌,他在量子计算和通讯领域也做过深入研究,有多部计算机著作。

笔者在陈皓的博客找到了一些描述,是陈皓翻译的Rob Pike的演讲,摘录(并少量修改)关键部分如下(以Rob Pike的第一人称描述):

2007年9月我在谷歌做一个庞大的C++项目,但是我负责的这部分在集群上要编译45分钟,同时有个消息说在C++社区的谷歌员工将开一场讲座介绍C++11,在那场持续一小时的讲座中,我听说了诸如计划中的35个新特性,有些十分微妙并难以理解,有些十分疯狂,那时候我问了自己一个问题: C++社区真的觉得C++错在没有足够多的特性吗?

我尝试将Newsqueak语言中的一些点子加入到C++中但是失败了,我实在难以将一组并发操作融入到C++的控制流程中去—,当真融进去的话,它们将变得十分丑陋臃肿,从而难以看到优越性,所以我放弃了这个想法。

但是C++11的讲座使我再次思考,将语言和今日的硬件绑在一起似乎有点目光短浅并且不明智,因为硬件过几年就有大变。
C++11讲座结束之后我们回到办公室,我面对Robert,开始问一些尖锐的问题。之后我们拉拢了Ken,并决定做些什么。我们再也不想写C++了,并且我们想让并发拿来就用,同时我们也想解决大系统编程的问题。我们在白板上写下一组迫切需要的东西,并且划出大体的轮廓,忽略了语法细节和语义。

文字较多,画个图来说明一下这个过程:

                    

从中可以看到:大牛们对C++已经有足够的实践和思想认识,也深知C++的优势和不足,面对软硬件的发展大牛们想在C++中增加一些自己想要的特性,但是那么做让C++更加难用,在深刻理解自己所想要的特性之后决定另起炉灶。

一点思考:在日常工作中也是如此,我们一味地批评一些软件和工具是很不理智的,只有深度使用才更有发言权,编程语言和工具类库都没有银弹,只有更合适更好用,业务规模决定架构,所以很多大公司在深刻理解自己业务的基础上会做很多新的东西去满足自己的需求。

2.2 Go的语言演进和迭代

Go语言的吉祥物gopher是一种生活在加拿大的小动物,它的中文名叫做囊地鼠,他们最大的特点就是挖洞速度特别快。

                            
                                                    图片来自网络

Go语言被称为是21世纪的C语言,从Go的语法和使用上去看确实继承了与C语言相似的语法表达、流程控制、基础数据结构等很多思想和技巧,发扬了C语言简单直接的编程哲学。

但是Go语言也并不仅仅是C语言的加强版,Go博多家所长进行融合创新推广,在柴树杉所著的《Go语言高级编程》中给出了Go的基因图谱,我们一起来看下:

                                                          图片来自网络
  • 左边一支

Go语言的并发特性是由贝尔实验室的Hoare(这是快排的发明者哦)于1978年发布的CSP理论演化而来,CSP并发模型在Squeak/NewSqueak和Alef等编程语言中逐步完善并走向实际应用,最终这些设计经验被消化并吸收到了Go语言中。

  • 中间一支

中间一支主要包含了Go语言中面向对象和包特性的演化历程,包和接口以及面向对象等特性则继承自Pascal语言,包的概念、导入和声明等语法来自于Modula-2编程语言,面向对象特性的声明语法等来自于Oberon编程语言,最终Go语言演化出了自己特有的面向对象模型的隐式接口等诸多特性。

  • 右边一支

Go语言是对C语言最彻底的一次扬弃和致敬,不仅仅是语法和C语言有着很多差异,最重要的是舍弃了C语言中灵活但是危险的指针运算。C语言中少即是多、简单直接的暴力编程哲学则被Go发扬光大。

从2007年底大牛们抽出20%时间创造的Go语言经过近12年的发展,Go语言作为后起之秀,已经发布了10多个重要的版本:

             

2.3 Go语言的社区生态

2009年11月10号谷歌开源Go语言,如下是Go团队的主要成员的开源通告,笔者简单翻译一下:

我们认为编程应该快速、高效,最重要的是有趣。这就是为什么我们对开源一种叫做Go新语言而感到兴奋。

Go将使用动态语言(如Python)的开发速度与编译语言(如C或C++)的性能和安全性结合起来。甚至大型二进制文件也能在几秒钟内编译完成,编译后的代码运行速度接近C。同时Go是一种支持多处理的系统编程语言,它是面向对象设计的一种全新的轻量级语言,加上一些很酷的特性,如真正的闭包和反射。

By Robert Griesemer, Rob Pike, Ken Thompson, Ian Taylor, Russ Cox, Jini Kim and Adam Langley - The Go Team

2019年11月8日Go Team发布邮件庆祝Go开源10周年,同时Go吉祥物Gopher的作者Renee French创作了新作:

                                                             图片来自网络

前文提及了Go语言的生态圈包括云计算云存储、区块链、web服务开发等诸多领域。在国内外很多公司Go都有拳头产品,尤其在国内有很多追捧者和推动者,巨大的应用场景和海量的用户群体,让我们看到了Go的潜力。

3. Go的主要优势

一门新语言不应该是我们学习的负担而应该我们解决问题的帮手、有好的工具才能多快好省地建设社会主义嘛!

3.1 天马行空

大白是毕业入坑嵌入式写C语言出道的,后来到互联网公司做后端开发写C++,最近一年写Python远多于C++,所以对于语言选择而言也是有一定感触的。

C++和C语言对比来说,C++由于增加了面向对象所以比C复杂,但是随着C++更多版本的推出越来越多的复杂特性确实让人觉得有些心力不足,相反C语言的语法特性并不复杂,即使这些基础的东西进行多种组合同样可以完成复杂软件开发,比如Linux、Redis等。

个人的一些感受而言新特性是为了解决问题,如果工具本身的复杂性超过了问题的复杂性,那么可能不是个好的趋势,C++很多时候作为带类的C配合STL使用已经可以解决很多问题,但是STL是通用的数据结构和算法库,并没有像Python一些的应用库,这样就导致了几乎每一家公司都会有一套自己的C++基础库,它们固然可以让我们很快解决问题,但是不具备通用性且经验可能无法很好地迁移,这也是个很大的问题。

当然对于语言的选择以及发展是仁者见仁智者见智的问题,笔者不想去撕PHP是世界上最好的语言这类问题,如人饮水冷暖自知就可以啦。

3.2 这就是Go语言

篇幅原因本文就只提Go语言的几个主要特性:

  • 并发特性

这可能是Go中最吸引人的特性了,Go语言引入了goroutine概念,它使得并发编程变得非常简单,Go实现CSP通信顺序进程模型来作为协程间的通信方式,使用消息传递来共享内存而不是使用共享内存来通信,Go语言让并发编程变得更加轻盈和安全。只需要简单的使用关键字go,就可以让函数以协程方式执行,更加轻盈更省资源,让并发真正飞入寻常百姓家。

在C++中很多服务端程序都是同步方式,因此机器使用率并不理想,异步编程方式存在一定难度,还有一些类似于腾讯libco方式的并发模式,不过都不是语言层面的并发支持。

  • GC机制

C和C++需要使用者管理内存,由于没有GC机制的限制,C/C++程序运行速度很快,但是这对开发者的要求也非常高,一不小心就可能会导致内存泄露。

Go语言作为一门新生语言,没有回避内存管理问题而是引入了GC机制,使用者不需考虑内存的回收而由语言提供垃圾回收器来回收内存,但是可能使程序运行效率降低。

  • 类型和接口

Go语言没有复杂的面向对象概念,直接使用最基本的类型组合功能。Go使用非侵入型接口的概念来实现C++中的一些面向对象机制,另辟蹊径使用不同的方法实现了相同的效果。

  • 混合编程

Go语言重用了很多的C语言模块,由于Go和C的这种天然的血缘关系,允许开发者混合编写C代码,CGO工具很好地支持了C语言函数的调用,这是一个非常好的支持。

  • 丰富的标准库

Go语言有非常丰富的包统称为标准库,它就像开发人员的百宝箱,提供了包含I/O操作、文本处理、正则、数据库、网络和分布式系统等常用业务包,让开发者可以快速解决问题,这也是Go可以迅速推广的重要原因,仿佛让Go拥有Python的开发效率但又不失强悍性能。

4.巨人的肩膀

5.关于我



有疑问加站长微信联系(非本文作者)

本文来自:掘金

感谢作者:后端技术指南针

查看原文:万丈高楼平地起|初识Go语言

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

3294 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传