网易有道ceo周枫推荐go语言。他认为go很好地继承了c语言灵活、简单有效的思想;go有很高的生产效率;go精选了一些复杂事情的优秀解决办法,通过语言功能和标准库提供出来。
go语言作为一个新的编程语言(8年历史,对比c的40年,java的20年很年轻了),很多人都挺喜欢,也写了不少推荐,互联网公司中在生产系统中使用go的(主要是在云端服务中)也在逐渐增多。刚好这几天和同事讨论到这个话题,这里提供一个我的版本的推荐:
1.go很好地继承了c语言灵活、简单有效的思想。我一直认为系统工程师应该读linux内核代码,同一套代码,可以跑在小到耳机,大到100核的服务器的所有设备上,而且改改配置就可以一键build出可跑的内核出来。这样灵活的系统,代码可读性还相当不错,归功于c语言简单有效的设计,让c颇有点“增一分则太肥,减一分则太瘦”的意思。传统的c++则是反面例子,新增语言功能的“投资回报”较差(c++11倒是解决了不少问题)。而go继承了c的这些风格,虽然细节不同,比如没有指针算术,在底层系统操作方面灵活性有所下降,但在很多方面变得更强大(并发性、自动内存管理等等)。go的关键词数量甚至少于c(25 vs. 30左右),简单性保持得很好。
2. go有很高的生产效率。举两个例子,go不需要build文件(makefile, java的build.xml, pom.xml这些),而是只需要执行go build即可,通过目录结构自己找到项目结构。通过这样的“约定优于配置”(convention over configuration)的设计,大大提高了效率。第二个例子是调用c代码的cgo的设计,使用过java的jni(包括android的ndk)的朋友应该知道,那来回生成.h文件,自己编译dll/.so的感觉是很酸爽的。而在go这里简单到可以把c代码直接嵌到go代码同一个文件里,然后go build就可以。效率就是节省的生命和金钱啊。
3. go精选了一些复杂事情的优秀解决办法,通过语言功能和标准库提供出来。比如并发性功能,goroutine和channels的确就是比线程和流更好的抽象。而json/xml/http/正则表达式这些,都有标准库的良好支持。这里go有别于swift,在语言特性的引入上很克制,很“精选”。对比go,swift感觉有点像个“学究”型的语言,引入了大批的语言特性,每个都很正确,但合起来就变得感觉繁琐。
下面翻译一篇“golang的微妙的生产力”(the subtle productivity of golang),作者paul hoehne,把这个话题再说说。
我承认我对新的编程语言很着迷(或者甚至尝试使用对我是新的老编程语言)。但我只会对促进生产力的语言感兴趣。一年前,我试了试go,发现了一种我多年没有感觉到的舒适感和生产力。当然,你也可以用其他语言做很多相同的事情。但是,像许多年前的c语言一样,go是一种在我的头脑中我可以完全掌握的语言。可以把它看作是在灰色物质缓存中运行,而不需要因为缓存缺失而访问stackoverflow.com。
随着语言的发展,增加了类似于并发(c++14)或泛型(java和c#几年前)的特性,它们变得更大、更复杂。c有大约30个关键字,c#有64个,java有53个左右,c++14个大约有80个。而go大约有25个。关键词并不是衡量语言复杂性的唯一标准。在c语言中编写应用程序常常比在java中更乏味。但关键字确实给人一种概念空间,开发人员在使用特定语言时需要处理这些概念。
我在研究生院花了很多时间用vi写c语言,没有自动完成功能,也很少打开手册。我用man pages来进行系统和库调用,但是我有足够多的内存在我的耳朵之间,以记忆住基本的调用(open, creat, trunc, read, write等等)。有一种形式的生产力来自于“能缓存住所有东西”。
我无法想象,如果没有支持自动完成、或立即语法检查等功能的ide的情况下,java编程的生产效率。当然,java可以做很多事情,但是它是有非常大的库的非常大的语言。声明main函数需要三个关键字(public static void),更不用说类声明的开销了。即使是我们认为理所当然的特性,http服务,也利用了几层库。java没有http服务提供者或服务使用者这样的“内含电池”的服务,这意味着您可能需要考虑使用netty或嵌入式tomcat。
我可以在没有独特功能的文本编辑器中写go。它是现代的语言,具有并发性、良好的unicode支持、以及包含http服务等现代特性。它感觉和c一样舒服,但是和java一样高效。对于一些人来说,“舒适”的语言是一种奇怪的概念,但是语言是一种工具,一种舒适的、易于使用的工具通常是一种更好的工具。
我也觉得,长期而言,go将成为容器化数据中心的语言。它静态地编译成二进制文件,因此运行时需求非常低。java、python、c#等要求容器具有相应的运行时安装的正确版本。而编写go应用程序很容易,它只使用普通的linux容器,而不需要额外的依赖。它从同一个代码库编译到windows, linux, mac os, arm目标。它允许我将一个应用程序作为单一的可执行的二进制文件交付。
为什么不是每个人都用它呢?首先,它是新的。我知道许多企业仍然在运行powerbuilder应用程序和基于jdk 6的服务。哎呀,我今天早上在app上买的咖啡可能会在某个时候运行40年前的cobol代码。go 1.0只有5岁。java大约有20年的历史,c#稍微年轻一些,但是java和c#当年满足了真正的需要,降低了编写应用程序的成本。在20世纪90年代后期,人们想当然地认为你会用c++编写应用,而用visual basic作为其前端。大量调试的时间花在奇怪的com错误或内存损坏上。用go代替java的理由不像停止用c++来惩罚自己那样强大。但是,当当我们迁移到一个基于容器的世界,而java变得越来越臃肿,那我认为go会获得优势。
随着越来越多的开发人员使用go,他们会发现,能够将整个语言(以及一些关键的库)保持在您的头脑中会导致一种微妙的生产力形式。而这一特点,正是其他越来越庞大、越来越复杂的语言所缺乏的。
霍尔传感器的应用范围
EMC工程问题解答(一)
PEC电力电子西安站蓄势待发
打造快捷安装全新力作,凌科推出锁螺丝款工业连接器新品
浅谈烟雾探测设备未来发展及挑战
网易有道CEO周枫推荐Go语言并介绍Go语言的3个优点
苹果的AR工具包_ARKit 1.5增强现实功能
用SPHRINT为新型药物输送系统打印3D微观结构
广东推行的人工智能产业集群,给人工智能企业带来了哪些启示?
晶闸管投切电力电容对比传统静态电容的优势在哪里?
中天科技携手中国铁塔成立了5G联合实验室
ARM微处理器在智能工业中有何应用?
ST LED NFC驱动器解决方案有哪些优点?
PIC单片机设计的SPWM控制技术
一文详细了解ArkUI框架新增能力
联想乐檬K3和红米2哪个最好
“景东120m脉冲星射电望远镜(JRT)研制”启动仪式成功举行
特斯拉欲在夏威夷部署世界上最大的电池系统 将为夏威夷这个洲直接供电
逆变器开不了机的原因 逆变器不输出高压怎么修 逆变器输出电压不足220v
JVM进阶知识(一):初识 JAVA 栈