2007 年,谷歌的一些程序员研究了编写软件的选择,但他们并不喜欢他们所看到的结果。他们需要管理数百万行代码,这些代码将不断为万维网存储和传输数据。这些代码将处理全球网络上数千甚至数百万个连接。数据路径充满了竞争情况和并发性带来的挑战。
现有的编程语言帮不上什么忙。它们是为游戏或桌面管理而构建的,或者在网络浏览器出现之前完成的许多其他常见任务。它们的缺陷和故障模式让谷歌的程序员抓狂不已,他们开始问是否有更好的方法。有没有一种语言可以在几行代码中处理 I/O 任务,同时又能满足谷歌所需的所有安全性和保障性?
这个问题的答案是否定的。因此,他们创建了Golang,一种表面上类似于 C 或Java 的简单语言。公共版本于 2009 年开始出现,第一个 1.0 版本于 2012 年发布。如今,Google 继续投资该语言,截至本文撰写时,最新的稳定版本是 1.22.5。
在 Google 内部,Go 语言为大量基础架构提供支持,并且也受到 Google 之外许多程序员的欢迎。该语言最近进入了Tiobe 指数的前 10 名。截至撰写本文时,它排名第八。
所有这些惊人的成就都为 Go 带来了许多赞誉,但也招致了一些批评。在许多情况下,同样的功能既招致贬低,也招致赞扬。一些开发人员喜欢 Go 的某些方面,而另一些开发人员同样讨厌它。
开发人员喜欢或讨厌 Go 语言的 8 个理由
- 易于学习
- 它不会偏袒任何一方
- 基于 C 的语法
- 规则太多
- 额外的错误处理
- 标准库
- 可执行文件大小
- 谷歌老大
Go 很容易学习
Go 的设计者有意打造了一种易于学习的语言,因为它没有太多复杂的功能或怪癖。他们没有给 Go 添加花哨的功能,而是选择精简语言,使其接近完成 Google 工作所需的最低限度。这意味着对好的想法说“不”,专注于程序员应该需要的理想化愿景。
为什么有人喜欢它:更简单的语言更容易让新程序员和团队成员学习。需要掌握的功能或构造更少,这意味着熟练的程序员可以在一天内掌握该语言。人员配备项目更容易,因为老手可以快速学会 Go 的新技巧。不仅如此,代码通常也更容易阅读,因为没有奇怪或神秘的结构出现在奇怪的地方。
为什么有些人讨厌它:简单不一定是坏事,只是省略了一些东西。女巫会选择一本删节版的咒语书吗?四分卫会选择一本只有几个战术的战术手册吗?一些程序员觉得用 Go 编程就像是一只手被绑在身后编程。这种语言缺乏其他语言设计者向世界展示的所有聪明才智,这是要付出高昂代价的。
Go 不会偏袒任何一方
最初的开发人员希望创建一种小型语言,为此他们牺牲了其他语言中许多受欢迎的功能。Go 是一种精简的语言。它可以满足您的需求,但又省去了繁琐的装饰。
为什么有些人喜欢它:许多开发人员都称赞 Go 的简单性。Go 不需要他们掌握或保持数十种功能的专业知识才能熟练使用。如果他们阅读一些代码,他们不会发现他们从未见过的结构。
为什么有人讨厌它:每个人都有一些喜欢的功能和技巧,但 Go 很可能不提供这些功能和技巧。开发人员有时会抱怨,他们只需一行 COBOL 或 Java 或其他喜欢的语言就可以完成在 Go 中可以完成的相同任务。
基于 C 的语法
Go 的创造者在 Unix 世界中有着深厚的根基,这一点显而易见。对于任何使用过 C 或任何从 C 中借鉴而来的语言(如 Java 或 C#)的人来说,它的语法都非常熟悉。Go 的花括号和输入法对这群人来说很舒服。设计团队确实从传统 C 中去除了一些粗糙的边缘,并简化了一些细节,使其看起来和感觉更现代,但在很大程度上,Golang 完全继承了从 C 开始的传统。
为什么有些人喜欢它:从小就使用 C 风格的程序员会直观地理解 Go 的大部分内容。他们将能够非常快速地学习语法,并且可以花时间学习 Go 清理 C 或 Java 中一些令人讨厌的角落的几种方法。有什么理由不喜欢呢?
为什么有人讨厌它:在很多方面,Python 的设计都是与 C 截然相反的。它没有花括号来划分代码块,而且输入是故意动态的。任何喜欢 Python 方法的人都会发现 Go 有很多让人讨厌的地方。从这个角度来看,用 Go 编程感觉就像倒退了一步或三步。
Go 的规则太多了
从一开始,Go 的创建者就希望不仅定义语法,还定义语言的大部分风格和使用模式。例如,他们制作了一个标准格式库,以阻止关于 Go 代码缩进方式的争论。他们整理了习惯用法列表,并鼓励程序员使用最好的习惯用法。他们还明确禁止了其他语言所不赞成的一些习惯,例如未使用的变量或循环依赖。Go 的构建过程被编程为在代码库中发现这些元素时停止。
为什么有人喜欢它:Go 的强惯用规则确保代码更容易理解。团队将减少对风格的争论,因为发展个人风格的选择或理由更少。
为什么有些人讨厌它:所有这些额外的规则和惯例都像束缚。为什么未使用的变量是个问题?如果编译器可以检测到它,那么它就可以将其删除而不会打扰我。程序员在生活中拥有一点自由难道这么糟糕吗?
Go 有额外的错误处理
现代编程中很多都包括为代码构建额外的路径,以便在出现错误时执行。代码正常运行,直到出现错误。当出现错误时,它必须恢复。它可能只是暂停一下,也可能完全放弃。构建自动化系统需要自省,以了解事情何时正常或失败。
Go 采用了一种新颖的方法,鼓励程序员将两种路径写入同一个函数。优秀的 Go 代码既说明了正常方法,也说明了出现错误时应该采取什么措施。Go 程序员喜欢说“错误是常规值”,因为它们是同一代码的一部分。甚至还有一个单独的错误类型系统,允许程序员创建更具体的错误形式,然后说明应该如何处理它们。
为什么有人喜欢它:Go 方法承认错误存在,并鼓励程序员制定处理错误的计划。这鼓励程序员提前计划并构建一种可以打造更好软件的弹性。
为什么有人讨厌它:不必要的错误处理使 Go 函数变得更胖、更难理解。通常,深层链中的每个函数都必须包含类似的代码,这些代码或多或少会执行相同的操作,并产生相同的错误。其他语言(如 Java 或 Python)鼓励程序员将错误“抛出”到链上的特定块中,以“捕获”它们,从而产生更干净的代码。
标准库
Go 的语法不仅旨在成为将团队团结在一起的简单而强大的标准。标准库包括对基于 Web 的微服务编程中常见的许多主要任务的支持。输入和输出例程从低级网络数据包处理开始,并处理所有日益复杂的任务,如处理 HTTPS 协议或解码 JSON 数据。设置完整的 Web 服务器只需要几行代码,因为它们都包含在net/http
库的“”部分中。
为什么有些人喜欢它:当许多标准功能由默认库处理时,大多数代码更易于阅读,因为没有人编写自己的版本或争论哪个包或第三方库更好。
为什么有人讨厌它:很难抱怨这么一堆好代码,但脾气暴躁的人喜欢指出竞争是需求和创新的良好指标。一些语言支持多个处理相同任务的包,这一事实表明人们对此有浓厚的兴趣和丰富的文化。
可执行文件大小
Go 团队的目标之一是让 Go 程序的部署变得简单,他们通过将所有内容捆绑到一个可执行文件中来实现这一目标。一切都已准备就绪,因为 Go 的所有库例程都包含在标准版本中。
多年来,不喜欢可执行文件大小达到几十甚至几百兆的开发人员已经找到了删除不必要部分的方法。设置正确的标志并在构建过程中包含额外步骤需要更多工作,但这是可以做到的。
为什么有人喜欢它:磁盘空间很便宜。当安装了不同版本的库时,在陌生的位置部署代码可能是一场噩梦。Go 开发人员只需构建一个可执行文件就可以为我们节省大量时间。
为什么有些人讨厌它:我的磁盘上有多少份 Go 库?如果我有 100 个程序,那就意味着 100 份。在某些时候,效率是一个考虑因素。是的,磁盘空间比以往任何时候都便宜,但内存带宽和缓存仍然是执行速度的主要问题。
谷歌老大
Golang 是由 Google 开发的,而这家大公司仍然是 Golang 的主要支持者之一,它提供了编译器和大部分工具链。Golang 也得到了一些来自 Google 外部的支持,比如GopherJS ,这是一个将 Go 转换为JavaScript 的转译器。但大多数情况下,Go 的开发工作都直接来自 Google 内部。
为什么有人喜欢它:如今,大量的工作涉及为服务器和客户端编写代码,而这类工作在 Google 的工作量中占了很大一部分。如果 Go 对 Google 有好处,那么对我们这些以同样方式工作的人来说,它也有好处。如果 Google 工程师开发了他们喜欢的东西,那么任何有类似项目的人都会同样喜欢它。
为什么有人讨厌它:并不是人们不喜欢谷歌本身,只是程序员不信任中央集权机构。供应商锁定和缺乏控制等问题对于任何试图管理技术栈的人来说都是严重的问题。谷歌的慷慨仍然让程序员心存疑虑,尤其是当其他语言选择都有庞大的开源社区围绕它们建立的时候。