为什么 Go 是我最喜欢的编程语言(2017)[翻译]#IT人的升职加薪tips#

关山初度尘未洗,策马扬鞭再奋蹄!这篇文章主要讲述为什么 Go 是我最喜欢的编程语言(2017)[翻译]#IT人的升职加薪tips#相关的知识,希望能为你提供帮助。
?

前言:Go 语言大热的今天,来看看 Michael Stapelberg 在 2017 年提到自己为什么喜欢 Go 语言吧。本文是一篇翻译文章,原文点??此处??。



??为什么 Go 语言是我最喜欢的编程语言??
2017-08-19 发表,上次修改 2020-11-21
我努力尊重每个人的个人喜好,所以我通常会避开关于哪种是最好的编程语言、文本编辑器或操作系统的辩论。
然而,最近我被问到了几次为什么我喜欢和大量使用 ??Go??,所以这是一个连贯的文章,可以填补我临时当面胡诌的空白 :-)。
我的背景我曾用 C 和 Perl 语言写过一些大型项目。 我也同时使用 python、Ruby、C ++、CHICKEN Scheme、Emacs Lisp、Rust 和 java(仅用于 android )编写程序。 我了解一点 Lua、php、Erlang 和 Haskell。 在更之前的生活中,我使用 Delphi 开发过许多程序。
在 2009 年 Go 刚发布的时候,我对它有过短暂的了解。2012 年 Go 1.0 发布时,我开始认真地使用这门语言,因为它具有 ??Go 1 的兼容性保证??。我仍然有 2012 年编写的代码在生产中运行,基本上没有动过。。
1. 清晰格式化
按照惯例,使用 ??gofmt?? 工具格式化代码。 程序格式化代码不是一个新的想法,但与其之前的编程语言不同的是, ??gofmt?? 恰恰只支持一种规范风格。
所有代码的格式都是一样的,这使得阅读代码更容易;代码感觉很熟悉。这不仅在阅读标准库或 Go 编译器时有帮助,而且在与许多代码库一起工作时也有帮助--尤其考虑到开源,或大公司。
此外,自动格式化在代码审查中是一个巨大的时间节省,因为它消除了以前可以审查代码的整个维度:现在,你可以只让你的持续集成系统验证 ??gofmt?? 没有产生差异。
有趣的是,让我的编辑器在保存文件时应用 ??gofmt?? ,改变了我写代码的方式。我曾经试图与格式化器所执行的内容相匹配,然后让它纠正我的错误。现在,我尽可能快地表达我的想法,并相信 ??gofmt?? 会让它变得漂亮(我输入的??例子??,点击 Format )。
高质量代码
我经常使用标准库(??docs??、??source??),见下文。
到目前为止,我所读过的所有标准库代码质量都非常高。
一个示例是 ??image/jpeg?? 包:我当时不知道 JPEG 如何在此时工作,但通过在??维基百科 JPEG 文章??和 ??image/jpeg?? 代码之间的切换,很容易就能掌握。 如果这个包有更多的注释,我会把它作为一个教学的示例。
观点
我已经同意 Go 社区持有的许多观点,例如:
  • ??变量名称??应该命名短一点,但如果变量使用离其声明越远,命名越要表达出更多的描述性。
  • 让依赖树依赖更小点(以合理的程度):??少量复制比少量依赖更好??
  • 引入抽象层是有代价的。 Go 代码通常很清晰,但清晰的代价是有时会重复。
  • 更多内容请参见?? CodeReviewComments ??和 ??Go Proverbs?? 。
较少的关键字和抽象层
Go 规范只列出了 ??25 个关键字??,我可以很容易地把这些关键词记在脑子里。
??内置函数??和??类型??也是如此。
根据我的经验,少量的抽象层和概念使得这门语言容易上手,并容易适应。
在我们谈论这个问题的时候:我对 ??GO 规范??的可读性感到惊讶。 它似乎真的以程序员为目标(而不是标准委员会?)。
2. 快速快反馈/低延时
我喜欢快速反馈。我欣赏快速加载的网站,我更喜欢流畅的用户界面,不延迟,我随时都会选择一个快速的工具而不是一个更强大的工具。大型网站的??调查??结果发现,大多数人都有这种想法。
Go 编译器的作者尊重我对低延迟的渴望:编译速度对他们来说很重要,新的优化会被仔细评估权衡,优化是否会降低编译速度。
我的一个朋友以前没有使用过 Go 。在使用 ??go get?? 安装了 ??RobustIRC?? 之后,他们得出结论,Go 一定是一种解释语言,我不得不纠正他们:不,Go的编译器就是这么快。
大多数 Go 工具也不例外,例如 ??gofmt?? 或 ??goimports?? 都快得惊人。
资源使用量最大化
对于批处理程序(相对于互动程序而言),充分利用可用资源通常比低延迟更重要。
剖析和改变Go程序以利用所有可用的 IOPS 、网络带宽或计算能力是非常容易的。举个例子,我写过填补1 Gbps 的??链接??,并优化了??debiman?? 以利用所有可用资源,使其运行时间减少了几个小时。
3. 丰富的标准库??Go 标准库??提供了有效使用常见通信协议和数据存储格式/机制的手段,如TCP/IP、HTTP、JPEG、SQL、...
Go 的标准库是我见过的最好的库。我认为它组织良好、干净、小而全面:我经常发现只用标准库和一两个外部包就可以写出合理规模的程序。
特定领域的数据类型和算法(一般来说)不包括在标准库,例如 ??golang.org/x/net/html?? 。??golang.org/x?? 命名空间也是新代码进入标准库之前的一个暂存区域:Go 1的兼容性保证排除了任何破坏性的改变,即使它们显然是值得的。一个突出的例子是 ??golang.org/x/crypto/ssh?? ,它不得不破坏现有的代码以??建立一个更安全的默认值??。
4. 工具为了下载、编译、安装和更新Go软件包,我使用 ??go get?? 工具。
【为什么 Go 是我最喜欢的编程语言(2017)[翻译]#IT人的升职加薪tips#】我所使用的所有 Go 代码库都使用了内置的??测试??设施。这不仅使测试变得简单而快速,而且??覆盖率报告??也很容易得到。
每当一个程序使用的资源超过预期,我就会启动 ??pprof??。关于 ??pprof?? 的介绍,请看 golang.org 的这篇??博文??,或者我关于优化 Debian Code Search 的??文章??。在导入 ??net/http/pprof?? 包之后,你可以在你的服务器运行时对其进行剖析,而无需重新编译或重新启动。
交叉编译就像设置 ??GOARCH?? 环境变量一样简单,例如,??GOARCH=arm64?? 用于针对 Raspberry Pi 3 的编译。值得注意的是,工具也可以跨平台工作。例如,我可以在我的 amd64 电脑上对 ??gokrazy?? 进行配置:??go tool pprof ~/go/bin/linux_arm64/dhcp http://gokrazy:3112/debug/pprof/heap?? 。
??godoc?? 以纯文本形式显示文档,或通过 HTTP 提供文档。??godoc.org?? 是一个公共实例,但我运行一个本地实例,以便在离线或尚未发布的软件包时使用。
请注意,这些都是该语言中的标准工具。在 C 语言中,上述的每一项都是要完成的重大成就。在 Go 中,我们认为它们是理所当然的。
入门希望我能够表达我为什么喜欢用 Go 工作。
如果你有兴趣开始使用 Go,请查看人们加入Gophers slack 频道时指出的??初学者资源??。见 ??https://golang.org/help/??。
注意事项当然,没有哪个编程工具是完全没有问题的。鉴于这篇文章解释了为什么 Go 是我最喜欢的编程语言,它的重点是积极的一面。不过,我还是要顺便提一下几个问题。
  • 如果你使用的 Go 包没有提供稳定的API,你可能想使用一个特定的、已知的工作版本。你最好的选择是 ??dep?? 工具,在写这篇文章时它还不是语言的一部分。
  • 直言不讳的 Go 代码不一定能转化为最高性能的机器代码,而且运行时间也是有代价的(小的)。在极少数情况下,我发现性能不足,我成功地求助于 ??cgo?? 或汇编程序。如果你的领域是硬实时应用程序或其他对性能要求极高的代码,你的路可能会有所不同。
  • 我写道,Go标准库是我见过的最好的标准库,但这并不意味着它没有任何问题。其中一个例子是通过标准库最古老的包之一 ??go/ast?? 以编程方式修改 Go 代码时对??注释的复杂处理??。

    推荐阅读