【20210818】最近特别火的一个语言GO

2021年08月18日

作者:小蒋聊技术

大家好,欢迎来到小蒋聊技术。小蒋准备和大家一起聊聊技术的那些事。

上周小蒋给大家分享了信通院发布的2021年《云计算白皮书(2021)》,一起了解了云计算市场最近的行业情况。

在全球云计算市场增速放缓的大环境下,我国云行业却逆势上扬。目前中国云计算市场也是可见一斑。

说到云,那么有一个最近特别火的编程语言,我们不得不提那就是GO 。最近的大厂招聘中,也总会看到这么一句“同时掌握GoLang者优先”。今天呢,小蒋就来和大家一起聊聊Go,看看它到底强在哪?!

2021年3月18日,腾讯正是对外公布了2020年度《腾讯研发大数据报告》。随着云计算和微服务相关技术的进一步发展,Go语言使用次数增速排名第一,并超越Java成为腾讯第二受欢迎的编程语言。

看完了咱自己的腾讯,再来看看全球的TIOBE 2021年八月份公布编程语言排行榜,目前GO语言排名是第18,去年GO的排名是第11,这是下降了不少。也正好和云计算全球增速放缓,国内云却逆势上扬相对应。

有人说,GO语言之所以出名,是赶上了云时代。那我们反过来说,是不是也意味着GO语言的出现,它也促使了云时代的蓬勃发展?这个就交给时间来证明 。

Go是google开发的一个编程语言,是2009年11月正是宣布推出,到目前已经12个年头了。从TIOBE语言指数我们可以看到,它的发展也是比较坎坷的。

Go项目的三位领导者均是著名的IT工程师,编程界的领军人物。肯·汤普逊(Ken Thompson)、罗布·派克(Rob Pike)、罗伯特·格瑞史莫(Robert Griesemer)。

可能有些朋友不熟悉他们的名字,但说一下他们做的东西,估计做大部分做IT的朋友都应该知道。

第一位是,肯·汤普逊(Ken Thompson),他是贝尔实验室Unix团队成员,C语言、Unix和Plan 9的创始人之一。

第二位是,罗布·派克(Rob Pike)作为肯·汤普逊(Ken Thompson)在贝尔实验室最早的伙伴之一,不仅参与了Unix的开发,而且和肯·汤普逊(Ken Thompson)共同开发了UTF-8字符集规范。

最后一位,是罗伯特·格瑞史莫(Robert Griesemer),他曾参与了V8 JavaScript引擎和java HotSpot虚拟机的研发。

他们被称为是计算机领域“发明之父”,对系统编程语言、操作系统、并行都有着非常深刻的见解。

所以我们可以从上图中看到,Go语言在刚发布的时候引起了一阵热度,然后就一直走下坡路。再后来在2016年重新流行起来。在国内呢,是最近3年才开始流行的。

小蒋,作为一名Java开发者,非常想弄清一件事。那就是:为什么要使用Go,它和Java相比优势究竟在哪里?

很多文档和教程只是说Go语言优秀, 还有一些理由是和语言本身特性相关的。就比如说:

  1. Go编译快
  2. Go执行快
  3. Go并发能力强
  4. Go垃圾回收能力强

等等,这些都是Go语言的特点,但这些也并非都是Go独有的呀。

  1. 解释型的脚本语言,Python与Ruby等,几乎不需要编译时间。
  2. 执行快,效率高的语言有C、C++、汇编等,他们的性能也非常强悍,基本上可以跑满物理硬件。
  3. 并发能力上Java的效率也未必比Go弱。
  4. Java 的垃圾回收,G1在大型项目中的效率并不算差。

毕竟,实际项目中去使用一个新技术,肯定是要明确目,解决某一类具体的问题。小蒋为了理解Go语言,看了Go语言的教程和文档。但这些资料中似乎并没有直接给出答案,当然也可能是小蒋的理解能力有限。

小蒋始终认为,Google绝对不会无缘无故的开发一个新的语言出来,这这背后肯定是有原因的。去找找资料,看看究竟为什么Google要弄一个新语言出来。小蒋翻了好久,终于找了Go语言之父罗布·派克(Rob Pike)他写的关于Go语言 的设计思想Go at Google: Language Design in the Service of Software Engineering,它详细介绍了GoLang的设计原则,这也是小蒋主要分析的依据。

说起Go语言的诞生,不得不说也是一件趣事。

这个事情就得追溯到2007年,为了解决当时Google开发遇到的问题,例如:

  1. C++编译慢、没有现代化的内存管理
  2. 数以万计的代码难以维护
  3. 部署的平台各式各样,交叉编译非常困难

当时C++委员会就在Google对C++语言新增加的35个新特性进行分享演讲,罗布·派克(Rob Pike)当时也在场。随着会议的中场休息,大家开始自由的进行讨论。讨论这些“C++语言新特性”是否能够带来更多的价值。

各位做研发朋友也都经常开会的。说是讨论,倒不如说是吐槽。最后google的工程师们一致认为:“与其在臃肿的语言上不断增加新特性,到不如简化编程语言。”

Go is a programming language designed by Google to help solve Google's problems

面对软硬件规模庞大,数据量大,系统众多且复杂,使用多种语言,编译构建缓慢等问题,既然Google当时找不到什么合适的解决办法,反正都是弄来自己用,Google选择重新造个轮子试试。

Go语言的出现,就是为了解决Google自己的问题而设计开发的。言下之意就是Google自己用着顺手就行,至于别人爽不爽和我无关。当时罗布·派克(Rob Pike)并没有预料到Go开源后会那么火热。当时的设计初衷就是为了解决公司内部的问题,并不想重复发明一个大而全的万能语言。

The goals of the Go project were to eliminate the slowness and clumsiness of software development at Google, and thereby to make the process more productive and scalable.

设计的目标就是消除慢速和笨拙,提高效率。

slow builds

uncontrolled dependencies

each programmer using a different subset of the language

poor program understanding (code hard to read, poorly documented, and so on)

duplication of effort

cost of updates

version skew

difficulty of writing automatic tools

cross-language builds

另外,Go语言是为了解决软件工程问题而生的。并不是为了处理单个特殊得业务特性。所以小蒋认为应该从更高层的软件工程层面去理解它,而不是仅仅看它的语法特点。

Concurrency is important to the modern computing environment with its multicore machines running web servers with multiple clients, what might be called the typical Google program. This kind of software is not especially well served by C++ or Java, which lack sufficient concurrency support at the language level.

文章中,作者重点介绍了并发的设计,这也是Go最为厉害的特性之一。同时强调并发性特性对现代计算环境的重要性的同时,也指出了C++和Java在语言层面对并发的支持不够。那什么是现代计算环境?对,就是现在我们用的云计算环境,Go语言在设计之初就考虑到了。这也就是为什么有些人说Go语言天生就是为而生的,在容器中运行时,没有遗留负担。

Go语言借用CSP模型的一些概念为之实现并发理论支持,其实Go语言并没有完全实现CSP模型的所有理论。仅仅借用了Process和channel两个概念。也就是Go语言中的goroutine和channel。

相信大家一定见过 一句话:

Do not communicate by sharing memory; instead, share memory by communicating.

不用通过共享内存来通信,而要通过通信来实现内存共享。这就是Go的并发哲学。

究竟什么场景时候可以选择Go,是否可以替换现有的语言?这个问题,小蒋一直想弄明白。

Go设计的初衷就是为了消除慢速和提高效率。Go天生并发,面向并发。但Go的设计初衷是为了解决google内部的问题,并不是为了要完美的替换掉谁。不过,很多公司因为业务上云后,发现性能大幅下降。因为云本身就是虚拟化,像“java这种一次编写,到处运行”也是依靠JVM的虚拟机。这种多层虚拟化,让原本就复杂的系统变得更复杂了。所以有些公司开始尝试用Go重构那些需要高并发的业务,开始尝试构建原生云生态。

另外“太阳底下没有新鲜事”,历史总是在“重复”。

当年写CGI,PHP打败了perl,因为PHP学习成本低。

同样,2018年vue 与react相比,vue更火。因为vue学习成本低。

Go相对于Java也有点类似,Go语法简单,容易上手,成本低。

小蒋最近也是做在业务上云,也是有所体会的。因为部分业务需要高并发,在资源不足的情况下,选择用Go进行业务重构,充分利用Go高并发的特点。那为什么不选择对现有架构进行优化,因为资源不足。面对交易这种业务场景,在原来10W核的情况下,平常CPU都在60%~70%左右了,而且经常资源报警。现在只有原来的一半资源,就不要想着优化了。选择Go其实是一种尝试,宁可要模糊的正确,也不选择精确的错误。

开发量在100人月左右的项目,同样的业务。业务子系统、中间件、数据库模型基本一致的情况下,各业务单元的接口完全一致,go实现要比java实现,在部署和运维上,成本降很多。

同样是2~3年的开发人员,go只要基本业务测试通过,性能与稳定性比java要好。这样算,开发成本,也降不少。

但是,如果是100人月员以上的项目,开发人员在30人以上,实话实说。还要看得看团队整体实力。这涉及到项目长期维护与迭代更新。建议还是选择容易招的开发语言,Java招聘还是挺容易的,Go就没那么简单了。

最近Go的确是特别火,小蒋想给要转Go的朋友一些建议,如果你是刚做开发3-5年。那一定先搞定你现在主修的语言。先精通一门编程语言,再去对照研究其他语言,这会让你对编程或设计,有更深入更透彻的理解与实践。

另外,了解编程思路,比掌握一门开发语言更重要。之所以有新开发语言,终极的目的还是为了解决业务问题,就像我们今天的主角Go。

好了,小蒋今天就和大家聊到这。

年龄的增长不可怕,可怕的是从未成长。

感谢大家支持小蒋,小蒋想和大家共同成长,谢谢。

音频(喜马拉雅):https://www.ximalaya.com/keji/51588599/445193510

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蒋聊技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值