资讯正文

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

放大字体  缩小字体 2019-11-17 18:09:34  阅读:244 作者:责任编辑NO。石雅莉0321

新智元报导来历:benjamincongdon.me修改:大明【新智元导读】Go言语越来越受欢迎,开发者都喜爱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/