当前位置: 首页 > 科技观察

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

时间:2023-03-23 01:53:07 科技观察

Go语言近年来受到越来越多开发者的青睐。在Go社区刚刚庆祝Go诞生10周年之际,谷歌云软件工程师BenjaminCongdon发表了个人博客,表达了他偏爱Go的一些原因。他说,“简单”是他喜欢使用Go语言的最重要原因。这是博客文章:我已经使用Go好几年了,我最欣赏Go的地方之一就是它的简单性。几个月前我开始在工作中使用Go编写代码,发现实现迭代非常容易,比Python和Java复杂得多。在Go社区庆祝其10岁生日之际,我一直想知道是什么让Go如此特别。我认为Go的很多真正优势来自于它的设计者的哲学:强调向前兼容性,该语言没有损害可读性的特性,而且它很容易获得。它提供了用户真正需要的一切(基本测试库、可靠的网络、同步原语、模板等)。版本依赖与向前兼容性一样低,在我看来,与任何其他语言相比,Go具有最全面的版本控制和依赖。我没有因为Go版本更新而遭受任何损失。这一点很重要。大约在同一时期,由于Rust的API更改,臭名昭著的Python2到3过渡,我的项目中断了。坦率地说,我认为任何旧的JS项目都不会在npm升级后幸存下来。使用Go,我注意到Go的库正在稳定。在Python和JavaScript中,一个库3年未更新是该库已死的标志。然而,在Go生态系统中,这个库可能仍然可用。在其他社区中可能被视为停滞不前或被忽视的是Go中复兴的标志。在Go中,我需要的依赖更少,而依赖本身也有更少的依赖。Go没有向外部依赖导出更多逻辑的习惯。代码重复在Go社区中也更容易被接受。这有时会令人沮丧。有时您可能只需要一个执行特定类型环境或分析的库。很多时候,你需要自己写,或者从StackOverflow的答案中找。但总的来说,我认为利大于弊。较少的依赖性意味着项目在几个月不活动后中断的可能性较小。不过,现在下结论对其他编程语言来说可能有点不公平。Rust还没有达到Go所具有的稳定性,可能是因为Rust还不是一门成熟的语言,但它也在朝着逐渐成熟的方向发展。Python3本身是向前兼容的,希望Python核心开发者能从中吸取教训。在这方面,我已经放弃了Javascript。Go的依赖系统并非没有问题。尽管GoModules很棒,但社区尚未达到100%的采用率。在GoModules之前,将所有内容都放在$GOPATH下的要求非常烦人,以至于我推迟了多年使用Go。现在情况有所好转,开始出现逐步好转的迹象。就向前兼容性而言,Go保证自Go1发布以来编写的所有Go代码都可以工作到Go2,直到未来某个不确定的时间点。这是一个坚定的承诺,我对这门语言的体验非常积极,至少到目前为止是这样。一些我现在不需要的功能将来可能非常需要。使用Go一段时间后,我开始想要一些Go语言根本不支持的额外功能。好吧,我和其他人一样反对C++模板,但是拥有类似集合的基本泛型并不过分,对吧?仅有的两种“开箱即用”的通用数据结构是数组(切片)和字典(映射)。你想写自己的数据结构吗?要么您必须针对特定类型设置它,要么您需要盯着一个充满接口的字段。{}这两种方法各有长处,但有时,我希望我可以只导入类型安全、通用、双向的映射。Go将“不需要”发挥到了极致。“需要”是这里的关键词。您不会“需要”泛型,但几乎肯定会需要它们。它是错误处理、函数式编程和运算符重载的最佳选择。那个“陈词滥调”怎么样?有时“少即是多”。除了命名的返回值,我想不出Go中有什么让用户疯狂的特性。令人印象深刻的是,Go核心开发者对Go中模仿其他语言的开发者社区表现出了极大的克制。Go2的未来让我非常兴奋,因为我期待看到我习惯的“下一代”Go是什么样子。Go的另一个惊人之处在于它提供了几乎所有你需要的东西。gotest是一个很好的基础测试框架。您不需要成为JUnit的领域专家,也不需要在单元测试类型之间进行选择。同样,Go的同步特性涵盖了你需要的大部分同步原语,http可以提供生产环境可以使用的HTTP服务器和客户端(甚至支持HTTP2),encoding包中有足够的工具来处理json、xml、csv,以及许多其他常见的数据格式。格式化,格式化,格式化,重要的事情说三遍最后必须要说的是gofmt。在格式化方面我有点挑剔。我并不特别关心适用哪些规则,但我非常关心一致性。Go的内部格式化工具gofmt被社区广泛采用,并提供了足够的一致性,使Go代码“看起来”地道,而不是看起来很疯狂。就个人而言,我发现使用gofmt阅读开源Go代码很容易。每个项目都遵循相同的格式约定,尽管每个项目都有自己的做事方式。从美学上讲,这是令人愉快的。所以,我喜欢围棋。曾经有一段时间,我对Python的禅宗着迷,对其他语言嗤之以鼻。但就目前而言,我期待着Go的光明未来。等Rust流行起来以后我可能会用Rust赶潮流,因为我确实喜欢一些函数式编程。但就目前而言,我非常愿意继续使用Go语言。