30

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

 4 years ago
source link: https://news.51cto.com/art/201911/606121.htm
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

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

作者:大明来源:新智元|2019-11-18 09:56

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

【编辑推荐】

【责任编辑:张燕妮 TEL:(010)68476606】
点赞 0
大家都在看猜你喜欢

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK