谷歌软件工程师:我为什么喜欢用Go语言?

新智元报道

来源:benjamincongdon.me

编辑:大明

【新智元导读】Go语言越来越受欢迎,开发者都喜欢Go语言的哪些特点呢?在社区庆祝Go诞生10周年生日之际,谷歌云软件工程师Benjamin Congdon发表个人博客,表达了自己对Go倍加青睐的一些原因。他表示,“简洁”是他喜欢使用Go语言最重要的原因。来新智元 AI 朋友圈和AI大咖们一起讨论吧。

Go语言最近几年逐渐获得越来越多的开发者的喜欢。在Go社区前不久刚刚庆祝Go诞生10周年生日之际,谷歌云软件工程师Benjamin Congdon发表个人博客,表达了自己对Go倍加青睐的一些原因。他表示,“简洁”是他喜欢使用Go语言最重要的原因。

以下是博客内容:

我使用Go已经好几年了,我最欣赏Go的一点就是它的简洁性。我在几个月前开始在工作中使用Go写代码,发现它真的很容易实现迭代,比Python和Java更为复杂的迭代。

当Go社区庆祝10岁生日时,我一直在想,是什么使Go变得如此与众不同。我认为Go的许多真正力量来自其设计师的理念:高度强调前向兼容性,该语言没有损害可读性的特性,并且随手可得。它提供了用户真正需要的一切(基本测试库,可靠的联网、同步原语以及模板等)。

前向兼容性有多高、版本依赖性就有多低

我认为,和其它语言相比,Go具有最完善的版本控制和依赖关系。我没有因为Go的版本更新遇到任何损失。这一点很重要。在差不多的时间段内,由于Rust的API更改,臭名昭著的Python 2到3过渡,我的项目一度陷入了中断。坦率地说,我觉得npm升级后的任何旧JS项目能不能延续都不好说。

借助Go,我注意到Go的库趋于稳定。在Python和JavaScript中,如果有3年未更新的库,则表明该库已死。而在Go生态系统中,这个库可能仍然可以使用。在其他社区中被视为停滞或忽视的事物,在Go这里反而是复兴的标志。

在Go中,我需要的依赖项更少,而依赖项本身的依赖项也更少。Go没有将更多的逻辑导出到外部依赖项习惯。Go社区中也更容易接受代码重复。有时这一点可能令人沮丧。有时你可能只想要一个执行某种类型的环境或分析的库。很多时候,你需要自己动手编写,或者从StackOverflow答案中去寻找。不过总的来说,我认为这一点还是利大于弊。更少的依赖项意味着项目闲置几个月之后被迫中断的可能性更低。

不过,现在下结论可能对其他编程语言有点不公平。Rust尚未达到Go所具有的稳定性,这可能是因为Rust还不是一种成熟的语言,但也正朝着逐步成熟方向发展。Python 3本身是向前兼容的,我希望Python核心开发人员能从中学到一些教训。在这方面,我对Javascript已经不抱什么希望了。

Go的依附系统也不是没有问题。尽管GoModules很棒,但社区仍未达到100%的采用率。在使用GoModules之前,将所有内容保存在$ GOPATH下的要求是如此烦人,以至于我推迟了多年才开始使用Go。现在情况已经好转,开始显示出逐步改善的迹象。

就向前兼容性而言,Go保证自Go 1发布以来编写的所有Go代码都可以工作到Go 2,直到将来某个不确定的时刻。这是一个强力的承诺,至少到目前为止,我对这种语言的使用体验还是非常积极的。

一些功能虽然现在不需要,以后可能很想要

在使用Go一段时间后,我开始想要一些Go语言根本不支持的额外功能。嗯,我对C ++模板的排斥程度不亚于任何一个人,但是拥有基本的集合类泛型这个要求也不过分,对吧?

具备“开箱即用”的仅有的两个通用化数据结构是数组(slice)和字典(map)。那是否要编写自己的数据结构呢?要么必须针对特定类型进行设置,要么需要盯着一个全是界面的字段{}。这两种方法都各有所长,但有时候,我希望我可以只导入类型安全的、通用的、双向map。

Go将“不需要”发挥到了极致。“需要”是这里的重点词。你将“不需要”泛型,但几乎可以肯定会需要它们。它在错误处理,功能编程和运算符重载上都是上上之选。

那句“陈词滥调”怎么说来着?有时“少即是多”。除了命名的返回值之外,我想不出Go语言中的任何让用户抓狂的功能了。令人印象深刻的是,Go核心开发人员对在Go中模仿其他语言的开发人员群体表现出了极大了约束。Go 2的未来对我来说真的很令人兴奋,因为我很期待看到已经习惯的“下一代” Go是什么样子。

对于Go令人赞叹的另一点是,它提供了几乎所有你需要的东西。

go test是一个很好的基础测试框架。你无需成为JUnit的领域专家,也无需在单元测试类型之间进行选择。同样,Go的同步功能涵盖了你需要的大多数同步原语,http可以提供可用于生产环境的HTTP服务器和客户端(甚至支持HTTP2),而且编码包中有足够多的工具可以处理json,xml,csv,以及许多其他常见格式的数据。

格式化,格式化,格式化,重要的事情说三遍

最后必须说到gofmt。在格式化方面,我有点挑剔。我并不特别在乎应用哪些规则,但是我非常在乎一致性。Go的内部格式化工具gofmt被社区广泛采用,并提供了足够的一致性,使Go的代码“看起来”很用的惯,而不会看代码看得要抓狂。

就我个人而言,我发现使用gofmt可以轻松阅读开源Go代码。尽管每个项目都有自己的处理方式,但是每个项目都遵循相同的格式约定。从美学上讲,这让人愉悦。

所以,我喜欢Go。曾经有一段时间,我被Python的Zen迷住了,并且对其他语言嗤之以。但现在,我期待Go的美好未来。我可能以后会在Rust流行起来之后,去用Rust赶一波时髦,因为我确实喜欢一些类似于函数式的编程。

但是现在,我非常愿意继续使用Go语言。

https://benjamincongdon.me/blog/2019/11/11/The-Value-in-Gos-Simplicity/