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

第一次接触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

基于GPRS/GSM网络实现交通诱导系统的设计
长江存储推出消费级固态硬盘_致钛ZHITAI
便携式钻孔测斜仪采集仪测量原理与测斜探头的连接及使用方法
可编程序控制器在铜冶炼生产过程中的应用
深入剖析锂电池保护电路的工作原理
GO语言简介!GO是理想的编程语言吗?
中兴推出Blade V9/Vita 拥有暗光双摄和全面屏设计
供应/回收HP54645A示波器HP54645A小兵/罗S1
中国功率器件大市场分析报告
新能源汽车电池均衡修复仪的原理与应用
有效管理孩子游戏时长 只需开启华为P10学生模式
支付宝在今年第三季度移动支付市场的份额中占比达到了53.58%排列第一
魅族16 Plus渲染图曝光:6.5英寸大屏幕,颜值颇高
经纬恒润港口自动驾驶项目荣获“绽放杯”山东赛区一等奖
Li-Fi的含义、与Wi-Fi的不同以及其优势
英特尔真的要放弃死气沉沉的PC业务了
空气污染监测系统的制作教程
中国电信引进 X86 和 ARM CPU 等服务器
全球灯泡价格继续下滑 欧美地区智能照明产品热销
小基站迎来发展机遇是由什么带来的