0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

GO语言简介!GO是理想的编程语言吗?

电子工程师 来源:lq 2019-04-29 09:47 次阅读

第一次接触GO是5年前,14年4月份,也是在我司,全职钻研一周,彼时C++中毒太深,内心排斥其他编程语言,看其他语法总觉得有点怪,而且有“C/C++能做任何事,故无用其他语言之必要”的思想在作祟。

我读研阶段用过几年Java,工作以来一直使用C++/C,况且教出几个非计算机系(包括英语系)的职业程序员,所以,我就浮夸一回,声称熟练掌握C++吧。

人都有思维定势,受限于自己的经验和认知,我亦不能例外,但好在我意识到这一点,所以在调研过程中,努力摒弃成见,尽量摆脱惯性,查阅关于GO的各种(包括核心设计师)文章,倾听拥趸和批评者的不同声音,结合自己的思考和分析,力求客观公正去评价GO。

▌GO语言简介

GO是Google开发的一种静态、强类型、编译型、并发型,并具有垃圾回收功能的类C编程语言。2009以开源项目的形式发布,2012年发布1.0稳定版本,距今已经十年了。

发明一种新的编程语言,首先得找到必要性,不然肯定会被质疑重复造轮子,方法嘛?无非是先找某种语言的一些茬,吐槽一番,复杂、笨拙、低效,太TM沙雕了,不能忍,劳资要立刻马上分分钟撸出一种新的编程语言,完美解决所有问题,不然对不起我卓尔不群的智商。

GO的故事也很套路,G公司Pike大牛听完C++0x的演讲,回到办公室,开始编译C++,等待编译过程中,转过椅子面向Robert,讨论语言的问题,然后拉上Ken爷爷一起合计,群嘲之后,受不了C++某些沙雕设计,还没等编译完成,三个老男人便一拍即合,决定一起搞点change the world的伟大事情,于是乎,GO诞生了。

GO语言之父Pike提到:GO语言是以C为原型,以C++为目标而设计的,希望C++程序员能以GO作为替代品。因为他觉得C++忒复杂了,要解救程序员于水火。

虽然GO以C++为目标而设计,但尴尬的是,Pike坦承GO并没有吸引来多少C++程序员,反而是吸引了不少Python、Ruby程序员。这、这、这、这。

▌GO核心团队

G公司不差钱不缺人,GO团队更是群星荟萃、大咖云集,不废话,直接上图:

核心设计师Pike和Ken都是出身自贝尔实验室,Ken之于Pike,亦师亦友,共同发明了UTF-8,还基情四射地结对编程过,感情好的穿一条裤子。

Pike是Unix先驱,贝尔实验室最早跟Ken、Dennis一起开发Unix的猛人,Plan9 OS的灵魂人物。大胡子Ken爷爷则是Unix之父,和Dennis一起发明了C语言,殿堂骨灰级程序员,早已是名满天下。

技术实力毋容置疑,不过这哥俩都是玩Kernel的,经历相同,理念相近,分歧会比较少,他们也都坦承C用得最多最熟,所以注定了GO的类C特性,不过这会不会导致GO设计上的思维火花不足,对OOP以及现代编程思想的支持不足,亦未可知。

▌GO的哲学

哲学是难分对错的,GO有GO的哲学,有它的取舍和审美,不一定每个人都认同,我觉得还挺有道理的,罗列如下:

少即是多

GO信奉:Less Is More,大道至简,臆测是乔帮主的信徒。

世界是并行的

世间万物是并行发生的,所以GO遵照这个规律,对并发的原生支持让GO更易于描述并行世界。

世界是物质组成的

微观世界由小的粒子组合成大的粒子;宏观世界由小的物体组合成大的物体。继承只能描述现实世界的一小部分,使用继承是不全面的;GO的设计选择的是组合,这个和现实世界比较吻合的设计,表现力更强。

世界是标准化的

硬件是标准化的,软件也应如此,GO的接口是DUCK模型,接口是非侵入式的。

正交性

GO的多个特性都是正交性的,正交性是保持事物稳定和简单的最好设计。

二八定律

80%代码只使用20%特性,增加语言特性,并不能提升效率,反而会增加复杂性,提高犯错率,加重程序员心智负担。

统一格式化

C++语法自由自在,于是乎一群吊丝为tab or space、大括号要不要换行等诸如此类的格式问题吵得不可开交。GO设计师认为,都是吃饱了撑的,你们太愚蠢了。

于是GO规定左大括号{不能换行放置,没有为什么,对着干直接编译不过。

GO编译器内建工具gofmt强制源码格式化。对不起,没有选项,我的地盘听我的,把精力focus到真正重要的事情上来,停止无意义的争吵。

这其实也是一种哲学:给你(我认为)最好的,而不是给你选择。就像iPhone一样,用户太笨了,他们根本不知道自己需要什么,就让帮主替你安排好一切吧。

不过GO强加个人喜好的一刀切做法,也招致批评和厌恶。有比较刚的程序员,直接因为大括号不让换行而抛弃GO。

作为一个经历过各种妖媚代码格式要求的程序员,我发出了杠铃般的笑声。

▌GO的特色

GO是介于C与C++之间的语言,比C抽象层次高,比C++抽象层次低。

因为是一门新的编程语言,站在巨人的肩膀,博采众长,规避了一些已知的问题,开发了一些优秀的特征,相比C/C++,GO的核心特征包括以下几个方面:

1. 原生并发,以东尼·霍尔的通信顺序进程(CSP)为基础的goroutine,适合现代多核机器

2. 垃圾回收,非常高效(请来世界顶级内存管理专家设计)

3. 强大的标准库,对网络编程等的良好支持

4. CGO提供了GO调用C机制,扩展了GO的能力边界

5. 内嵌关联数组

6. 非侵入式的接口设计

7. 简单清晰的语法,以及强编码规则,好处可能远超想象

▌GO vs C/C++

[GO与C语法详细对比](http://hyperpolyglot.org/c)

▌性能对比

虽然GO号称兼备C++的运行效率和PHP的开发效率,但benchmarks好像打脸了,从数据上看,GO的运行效率接近却略低于Java。

▌研发效率

我乐观预计GO的研发效率上优于C/C++,特别是*nix环境下。

▌流行度

GO获得TIOBE 2016年度最佳,2017年10月获得第10,历史最高排名。

GO诞生10年,虽然背靠Google,但依然没有挺进编程语言第一阵营 ,属于外围三线。

近一年多流行度排名有所下滑,铁打的Java、C/C++,流水的编程语言。

▌工程化水平

知名项目:

Docker:大名鼎鼎的开源应用容器引擎

K8S:容器编排管理系统的事实标准

...

GO更适合开发服务器端大型软件,高性能分布式系统领域,网络编程,并发编程,被誉为云时代的C语言。

GO成为云计算时代流行起来,促进了云计算的发展,Google用GO的多,今日头条、Uber等公司也用GO对业务进行了彻底的重构,golang.org YouTube.com也在使用GO开发。

美国市值TOP20有一半在使用GO,国外很多初创公司选择GO,国内关注高,但还未得到广泛应用,应用上呈现国外热国内冷的特点。

Go语言目前所面临的最大问题在于,还没有足够的经验来证明GO是否真的是一个成功的产品,缺少足够多超大型应用的实践。

总体而言,GO的工程化水平低于C/C++和Java等第一梯队语言。

▌争议和不足

GO最初声称为了解决Google的问题而设计,为了帮助人们阅读、调试和维护软件而生,但目前为止,难言圆满。

GO的异常处理经常被吐槽,GC提高了安全性却失去了控制力,组合代替继承真的好吗?包管理做的好吗?

摒弃先入为主的观念影响,重新客观审视GO语言,我觉得在语言设计层面,GO确实更自然、更简约。比如摒弃行尾的分号,比如if/for不需要圆括号包裹条件,放空内心去想,好像真的更合理。

GO抖掉了C++的诸多包袱,让程序简单,也更容易理解(特别是相对于C),但是随着GO的发展,语法也有可能变重,比如GO 2.0版又把它之前批评的泛型引入了,当初GO批评别人的点又有可能反过来被别人批评。

而关于语法层面是否真的更简洁,也是有争议的,三目运算符不支持+强制大括号让一行C代码变成多行GO真的更简单了吗?比如编程语言专家庄晓立(Liigo)在CSDN上有吐槽的文章,仔细读来,也有一定道理,我贴一个链接,可以参考一下。

原文链接:https://blog.csdn.net/liigo/article/details/23699459

另外GO是G公司的,虽然目前开源,但会不会哪天也像Oracle一样,穷疯了便开始薅羊毛,Oracle Java JDK已经开始割韭菜了,所以GO智慧产权的风险依然存在,而C/C++已经是宇宙人类的了,世界性的标准化组织在控制管理,风险无穷逼近于零。

▌小结

GO在一些点确实有突破,比如让并发编程更容易、运行更高效,比如垃圾回收让程序更安全,比如基于消息(Channel)编程的支持,比如内嵌关联结构,这些都很赞,也很重要。编程语言发展这么多年,任何突破都是艰难和宝贵的。

Goroutine是GO的杀手锏,经过GO改造后的系统有更高并发量和IO吞吐率。

GO跟C非常像,这并不奇怪,因为设计师都是C语言大师,C/C++程序员很容易切换到GO,但Java程序员转GO可能要困难一些。

另一个隐患就是在Java占主导的生态中,GO显得比较小众,跟其他中间件的融合也存在潜在风险,引入复杂性甚至混乱。

回到标题的问题,GO是更好的语言吗?GO是理想的编程语言吗?说实话,我不知道,而且我的观点也不重要,这似乎是一个哲学问题。

是否要选择GO作为项目开发语言,我认为不应该被GO声称的优势迷惑,因为你去google任何一门语言,都能收获一堆优点,PR会自然而然的对缺点选择性忽视。

但也不能因循守旧,而应该仔细辨别,你度量什么便得到什么。GO是否适合你的项目,GO的新特点和优势对你的项目是否真有必要,是否真有帮助,能给你的项目带来什么好处?比如你写一个单机游戏程序可能GO网络库的简便对你而言为零,所得收益跟你付出新学一门语言的成本相比如何?同时,它的缺陷是什么?你是否全面理解?

有时候,它或许就像一位花枝招展的姑娘,待你抛弃一切去拥抱它的时候,你会发现,它的美好只是存在于你的幻想中,当然也有另一种可能,它真的非常好,很适合你,恭喜你,热情的拥抱它吧。

GO有它适应场景,比如适合网络程序、云应用、微服务、高性能分布式、大型多人协同,可能在开发效率上有非常大的提升,清晰度上也有提高,可能是理想的首选。

或许我会尝试用GO开发新项目或者改写老项目,谁知道呢?这取决于权衡折中,取决于领导决断,也取决于我的心情。

▌附录

一段GO的示例代码,品味一下GO的STYLE

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表德赢Vwin官网 网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编程语言
    +关注

    关注

    10

    文章

    1908

    浏览量

    34264
  • C++
    C++
    +关注

    关注

    21

    文章

    2084

    浏览量

    73232
  • go语言
    +关注

    关注

    1

    文章

    156

    浏览量

    8985

原文标题:Go是更好的编程语言吗?

文章出处:【微信号:rgznai100,微信公众号:rgznai100】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Go语言简介和安装方法

    Go又称 Golang ,是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型 语言Go 语言语法与
    发表于07-19 16:33 489次阅读

    Go语言中的整数类型

    Go 语言中,整型可以细分成两个种类十个类型。
    发表于07-20 15:25 670次阅读

    go语言能做什么工作?

    让程序员更容易地进行维护和修改。它融合了传统编译型 语言的高效性和脚本 语言的易用性和富于表达性。 Go 语言作为服务器 编程
    发表于03-22 15:03

    Go开发语言的优势在哪里?

    Go 语言是谷歌发布的第二款开源 编程 语言,可以在不损失应用程序性能的情况下降低代码的复杂性,并专门针对多处理器系统应用程序的 编程进行了优化,开
    发表于03-22 15:04

    网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点

    网易有道CEO周枫推荐 Go 语言。他认为 Go很好地继承了C 语言灵活、简单有效的思想; Go有很高的生产效率;
    的头像 发表于01-31 14:11 5071次阅读

    Go和Python,Erlang的语言对比分析和Go编程示例概述

    本文对 Go和Python、Erlang做了一些有趣的分析对比,相信大家能从中感受到 Go 语言的强大和与众不同。
    的头像 发表于07-21 09:52 7539次阅读
    <b class='flag-5'>Go</b>和Python,Erlang的<b class='flag-5'>语言</b>对比分析和<b class='flag-5'>Go</b><b class='flag-5'>编程</b>示例概述

    学习Go语言PDF电子书免费下载

    这是关于来自Google 的 Go 语言简介。目标是为这个新的、革命性的 语言提供一个指南。
    发表于08-29 16:30 9次下载
    学习<b class='flag-5'>Go</b><b class='flag-5'>语言</b>PDF电子书免费下载

    华为云的Go语言编程的众多干货

    近日,国内较权威的 Go大会——Gopher China召开,众多一线互联网公司的大神们汇聚一堂,深入探讨了 Go 语言并产生了诸多干货。其中,华为云微服务首席架构师田晓亮老师也受邀参与本次大会,以
    的头像 发表于12-17 17:59 2127次阅读

    Go语言在世界各地的使用情况如何?

    开发者 数量 所处地区 全球大约有 110 万名职业 Go开发者(特指在工作中专门将 Go作为主力 编程 语言的群
    的头像 发表于02-26 14:10 3803次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>在世界各地的使用情况如何?

    详解GO语言的趋势与使用情况

    Go 语言简单易学、性能优良。JetBrains Blog 发布了 Go 语言的调查报告,看看 GO 语言
    的头像 发表于03-17 11:05 2939次阅读

    Go语言凭借什么成为云原生第一语言的?

    发展势头强劲,凭借其简洁、高效的特性,在竞争激烈的 编程 语言市场中占据了一席之地。 如果你对 Go的发展趋势还不明朗的话,不妨仔细看看我后面说的。 据 StackOverflow(全球最大的
    的头像 发表于04-22 10:15 3039次阅读
    <b class='flag-5'>Go</b><b class='flag-5'>语言</b>凭借什么成为云原生第一<b class='flag-5'>语言</b>的?

    go语言枚举类型怎么用

    go 语言枚举类型是这么用的?在什么场景下会用到枚举?本文对 go 语言枚举做了详细讲解。 枚举,是一种重要的数据类型,由一组键值对组成,通常用来在
    的头像 发表于09-02 09:43 5045次阅读

    带你了解go语言中的闭包

    【 导读】什么是闭包? 什么场景下会用闭包 ? 本文对 go 语言中的闭包做了详细介绍。 闭包是由函数及其相关引用环境组合而成的实体(即:闭包=函数+引用环境)。 Go中的闭包 闭包是函数式
    的头像 发表于11-02 15:27 2307次阅读

    go语言中怎么使用HTTP代理

    go 语言中怎么使用HTTP代理。
    的头像 发表于09-01 14:41 2297次阅读

    Go编程语言-你应该知道的一切

    Go 编程 语言的故事始于 Google,当时三位工程师 Robert Griesemer、Rob Pike 和 Ken Thompson 对 C++ 的复杂性以及缺乏提供高效编译和执行的简单
    的头像 发表于12-11 17:37 458次阅读