3

为什么说Go是我接触过最爽的语言?

昌维 1月12日 发布于后端 www.sohu.com

为什么说Go是我接触过最爽的语言?

1月12日 发布,来源:www.sohu.com

原标题:为什么说Go是我接触过最爽的语言?

作者|程天

编辑|Alice Qin

为什么Go是“另一门世界上最好的语言”?

我最早接触Go语言是去年暑假在奇虎360实习的时候,当时开发了一个Go项目CuckooFilter(可以在我的个人Github上面找到),对这门大道至简的语言兴趣颇丰。看网上评论,似乎Goer颇为狂热,于是这门语言被讽刺为“另一门世界上最好的语言”。

“最爽的语言”

Go是不是世界上最好的语言我不清楚,因为我接触的语言也不过十五六种,开发过正式工程的语言也不过Java、PHP、Go、Lua、C、C++、Python、Java等屈指可数的几种。对于我而言,严谨的表达是:这是我认为我接触过的语言最爽的语言。

Go是一种新的实验性的并发的带垃圾回收的系统语言,它出身名门,是Google主导开发的,而出身名门的另一重含义,来自于它最初的开发者们,他们是罗宾·派克、肯·汤姆逊等人。肯·汤普逊是Unix最早的创始人,有丰富的语言和操作系统开发经验,他也曾深度参与过B语言和Plan 9操作系统的开发。至于罗宾·派克,他有一本著名的《UNIX编程环境》,另外,著名的UTF-8,也是他设计的(这大概也是Go强制选择UTF-8编码的原因吧)。

在语法上,Go进行了大刀阔斧的改良,我猜Go的开发者觉得Java糟糕透了,Java可能是最繁文冗节的语言了,当然繁文冗节在学术上有另一个名字,叫所谓的严谨。

Go语言强制语法格式,譬如左括号不换行、逗号后面要空格、缩进等,都是语言本身要求的,甚至函数名的大小写都有一定要求,这也就避免了各种信徒互相指摘。当然,也许我觉得Go语言足够优雅简洁的原因,也是它的编码格式完全符合我对编程规范的要求。

这篇不是Go语言的学习文档,所以不会对Go的语法格式做细致的介绍,不过Go的变量声明却很值得介绍一下。Go是静态类型语言,我们知道,在很多静态类型语言中,由于需要对类型进行大量的描述,譬如Java,我曾经在一篇文章中批判过Java很多,Java的系统类型名字往往冗长,导致代码中经常有很多令人挠头变量声明。Go使用“:=”默认指定左值的类型为右值的实际类型,完美精简了代码,保持了整洁(我实在不想满篇看着float64和uint)。

Go不支持泛型,但是数组、切片、通道、字典完美的覆盖了泛型所支持的功能。

Go没有泛型,也不支持多态。似乎在今天我们提到面向对象的时候就一定要说“多态”,可是在开发中,真正恰如其分使用多态的场景似乎也不多,甚至我们经常会忘记它。或许多态在学术上的价值比工程上的价值要大。相对而言,鸭子类型似乎更像一种随心所欲的多态,这也是Go的哲学。

所谓鸭子类型,是说:一个对象有效的语义,不是由继承自特定的类或实现特定的接口,而是由"当前方法和属性的集合"决定。就像谚语里面说的:

“当看到一只鸟走起来像鸭子、游泳起来像鸭子、叫起来也像鸭子,那么这只鸟就可以被称为鸭子。”

Go出身名门,它的爸爸叫Google

刚才说,Go出身名门,它的爸爸叫Google。对于商业公司而言,肯定不会无缘无故开发一门语言。我们知道很多语言譬如PHP的开发初衷和它后来的应用场景完全不同,然而作为一家商业公司,Google支持Go绝对不是玩票的。

Google正式项目只允许使用四种语言:C/C++、Python、Java、Java。Go作为一种系统语言,对应于上面四种的C/C++。可以认为,Go的出现,一定起源于Google对C/C++某些问题的不满。不过我们想想,C/C++历史那么久远,存在历史问题也几乎是理所当然。

##在这些方面,Go 优于C/C++

Go优于C/C++的主要在垃圾回收(GC)和轻巧的并发特性。特别是垃圾回收,C/C++开发效率一直无法提升的根本原因是其糟糕的垃圾回收机制。虽然Java率先使用的GC机制曾经被认为严重降低了性能,但是今天看似乎也没产生什么致命性的问题。然而C/C++在垃圾回收问题上的后进,对于工程进度的整体把控,却产生了严重问题。这可能是令Google抓耳挠腮的事情。

Go最早开发于2007年,2009年发布,可以说其与大数据、云计算的时代是并行的,所以它的基因里就包含了对高并发的优雅支持。

在Go之前,系统语言实现并发只能用C/C++的线程蹩脚的实现,可是在今天,对于并发,线程可不是什么时髦工具,因为在多核处理器上,线程几乎毫无优势。

Go语言参考通信顺序进程模型,在语言层级对并发做了高度支持,把多核处理器的优势发挥的淋漓尽致,而这一切只需要通过一个go关键字控制。它是轻量级的、内存共享的、上下文自动切换的一种方案。

内存共享就会存在资源锁问题,通过进程通道,Go解决了互斥锁的问题,在业务中几乎可以不考虑,另外在go子程序中,推荐传值而不是穿指针的参数传递,进一步降低了资源滥用的问题。

一个程序不可能创建成千上百个进程或者线程,所以多进程和多线程都不是并发的最优解决方案。Go并发的轻量,体现在其并发机制是建立在轻型控制流程的基础上的,对于程序而言,建立成千上万个轻型控制流程,毫无压力。

同时,支持了自动上下文切换,都支持在多核处理器的多个核心上同时运行。

而这些优势,都是C/C++所不具备的。

当然,也不是说Go是面面俱到的。在设计的时候,Go的目标是做到压倒性高速编译,并且在执行时间上控制在比C多10%到20%左右,不过,高速编译至今相当遥远,就是执行时间的控制上,也远远没有达到设计目标。

不过无论如何,在下一代编程语言中,Go都是天之骄子。至2017年,Go已经走过了一个十年,作为Go的爱好者,我相信下一个十年,Go能占领系统编程领域。

限时报名,最后3天!

4.15 - 4.16,国内最大最专业的Go大会—GopherChina大会,将由StuQ独家直播!

Google Cloud 工程师Francesc Campoy、哔哩哔哩的技术总监毛剑、华为开源技术专家马全一、阿里云工程师聪心、360 工程师郭军、有赞科技技术专家李文、VMWare中国研发中心云原生应用首席架构师张海宁、七牛大数据开发高级工程师孙建波等17位技术大咖均已到场!

空前强大的导师阵容,为你呈现 Go 在微服务、大数据、金融、Go 内核等多个最前沿主题的技术演讲。在直播结束后,StuQ将会为你送出演讲嘉宾们的独家PPT干货!助你登上技术之巅,成为人生赢家!

直播报名在火热进行中,

限时报名最后3天!

「 阅读原文 」了解更多直播详情!返回搜狐,查看更多

责任编辑:

867 浏览 1 收藏 报告 阅读模式
hiddendeerer · 5 天前

之前还看过一篇叫为什么我放弃go的文章,难过的是哪个才是真理,有说好有说差七嘴八舌,我只相信面向工资编程,面向解决问题编程

+4 回复

0

看完“放弃 Go”的文章,再看看“Go 很爽”的文章,文章里都罗列了许多理由。仔细想想这些理由是否符合你的个人情况。
比如上面这篇“Go 很爽”的文章,里面提到的 Go 的优点,你都很欣喜吗?再看看你那篇“放弃 Go”的文章,里面提到的 Go 的缺点,你都在意吗?
这里没有什么真理可言的,都是存在即合理。适合你的就是好的。
看看支持的文章,再看看反对的文章,最后根据文章里罗列的点,总结自己的看法。

jinliming2 · 3 天前
0

比如我之前看过的那篇“放弃 Go”的文章,里面的理由有一条是:Go 强制语法风格,行尾不用写分号。
可是我对此丝毫不在意,反而很欣喜,终于不用纠结语言风格了,不用纠结选择什么 lint 工具了,不用纠结怎么配置 lint 规则了,官方的语言规范就足够了。
由此,那篇文章中提到的缺点,对我来看却是优点。

每个人看法不同,也不用在这上面纠结。

jinliming2 · 3 天前
载入中...