网易有道CEO周枫:Go语言继承了C语言的灵活简单

简介: 网易有道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"就可以。效率就是节省的生命和金钱啊smiley_0.png?wx_lazy=1

3. Go精选了一些复杂事情的优秀解决办法,通过语言功能和标准库提供出来。比如并发性功能,goroutine和channels的确就是比线程和流更好的抽象。而JSON/XML/HTTP/正则表达式这些,都有标准库的良好支持。这里Go有别于Swift,在语言特性的引入上很克制,很“精选”。对比Go,Swift感觉有点像个“学究”型的语言,引入了大批的语言特性,每个都很正确,但合起来就变得感觉繁琐。

参考“Javascript是儿童编程好的语言选择”

下面翻译一篇“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,他们会发现,能够将整个语言(以及一些关键的库)保持在您的头脑中会导致一种微妙的生产力形式。而这一特点,正是其他越来越庞大、越来越复杂的语言所缺乏的。


原文发布时间为:2018-01-30

本文作者:常佩琦

本文来自云栖社区合作伙伴新智元,了解相关信息可以关注“AI_era”微信公众号

原文链接:网易有道CEO周枫:Go语言继承了C语言的灵活简单

相关文章
|
2天前
|
存储 编译器 Go
Go语言学习12-数据的使用
【5月更文挑战第5天】本篇 Huazie 向大家介绍 Go 语言数据的使用,包含赋值语句、常量与变量、可比性与有序性
37 6
Go语言学习12-数据的使用
|
3天前
|
Java Go
一文带你速通go语言指针
Go语言指针入门指南:简述指针用于提升效率,通过地址操作变量。文章作者sharkChili是Java/CSDN专家,维护Java Guide项目。文中介绍指针声明、取值,展示如何通过指针修改变量值及在函数中的应用。通过实例解析如何使用指针优化函数,以实现对原变量的直接修改。作者还邀请读者加入交流群深入探讨,并鼓励关注其公众号“写代码的SharkChili”。
9 0
|
3天前
|
存储 缓存 Java
来聊聊go语言的hashMap
本文介绍了Go语言中的`map`与Java的不同设计思想。作者`sharkChili`是一名Java和Go开发者,同时也是CSDN博客专家及JavaGuide项目的维护者。文章探讨了Go语言`map`的数据结构,包括`count`、`buckets指针`和`bmap`,解释了键值对的存储方式,如何利用内存对齐优化空间使用,并展示了`map`的初始化、插入键值对以及查找数据的源码过程。此外,作者还分享了如何通过汇编查看`map`操作,并鼓励读者深入研究Go的哈希冲突解决和源码。最后,作者提供了一个交流群,供读者讨论相关话题。
14 0
|
4天前
|
Java Go
Go语言学习11-数据初始化
【5月更文挑战第3天】本篇带大家通过内建函数 new 和 make 了解Go语言的数据初始化过程
17 1
Go语言学习11-数据初始化
|
4天前
|
自然语言处理 安全 Java
速通Go语言编译过程
Go语言编译过程详解:从词法分析(生成token)到句法分析(构建语法树),再到语义分析(类型检查、推断、匹配及函数内联)、生成中间码(SSA)和汇编码。最后,通过链接生成可执行文件。作者sharkchili,CSDN Java博客专家,分享技术细节,邀请读者加入交流群。
22 2
|
5天前
|
Java Linux Go
一文带你速通Go语言基础语法
本文是关于Go语言的入门介绍,作者因其简洁高效的特性对Go语言情有独钟。文章首先概述了Go语言的优势,包括快速上手、并发编程简单、设计简洁且功能强大,以及丰富的标准库。接着,文章通过示例展示了如何编写和运行Go代码,包括声明包、导入包和输出语句。此外,还介绍了Go的语法基础,如变量类型(数字、字符串、布尔和复数)、变量赋值、类型转换和默认值。文章还涉及条件分支(if和switch)和循环结构(for)。最后,简要提到了Go函数的定义和多返回值特性,以及一些常见的Go命令。作者计划在后续文章中进一步探讨Go语言的其他方面。
10 0
|
6天前
|
JavaScript 前端开发 Go
Go语言的入门学习
【4月更文挑战第7天】Go语言,通常称为Golang,是由Google设计并开发的一种编程语言,它于2009年公开发布。Go的设计团队主要包括Robert Griesemer、Rob Pike和Ken Thompson,这三位都是计算机科学和软件工程领域的杰出人物。
14 1
|
6天前
|
Go
|
7天前
|
分布式计算 Java Go
Golang深入浅出之-Go语言中的分布式计算框架Apache Beam
【5月更文挑战第6天】Apache Beam是一个统一的编程模型,适用于批处理和流处理,主要支持Java和Python,但也提供实验性的Go SDK。Go SDK的基本概念包括`PTransform`、`PCollection`和`Pipeline`。在使用中,需注意类型转换、窗口和触发器配置、资源管理和错误处理。尽管Go SDK文档有限,生态系统尚不成熟,且性能可能不高,但它仍为分布式计算提供了可移植的解决方案。通过理解和掌握Beam模型,开发者能编写高效的数据处理程序。
135 1
|
7天前
|
算法 关系型数据库 MySQL
Go语言中的分布式ID生成器设计与实现
【5月更文挑战第6天】本文探讨了Go语言在分布式系统中生成全局唯一ID的策略,包括Twitter的Snowflake算法、UUID和MySQL自增ID。Snowflake算法通过时间戳、节点ID和序列号生成ID,Go实现中需处理时间回拨问题。UUID保证全局唯一,但长度较长。MySQL自增ID依赖数据库,可能造成性能瓶颈。选择策略时需考虑业务需求和并发、时间同步等挑战,以确保系统稳定可靠。
113 0