Why Go is my favorite programming language

作者:Michael Stapelberg

背景介绍

我曾经使用C语言和Perl语言完成过一些大型项目。Python、Ruby、C++、CHICKEN Scheme、Emacs Lisp、Rust和Java(只用过开发Android)这些语言我也都使用过。我还了解一点点的Haskell、PHP、Erlang和Lua。在更早之前,我还用过Delphi开发过一些程序。

2009年当Go语言第一次发布的时候,我曾经稍微关注过。而真正开始使用是在2012年发布1.0版本的时候,1.0版本的主要特征就是Go-1兼容性保证。现在生产环境上面还有一些代码是我在2012年的时候写的,很多都没有改过。

1.清晰度

格式化

按照惯例,Go代码可以使用gofmt工具进行格式化。以编程方式格式化代码并不是一个新概念,但是与之前不同的是gofmt支持规范化风格。

将所有代码格式化成相同的方式使代码变得更容易阅读;看起来也更熟悉。这不仅有助于阅读标准库或Go语言编译器,而且在处理许多代码库时也会有很多好处——想想Open Source或其他的大公司就知道了。

此外,在代码评审过程中自动格式化也可以节省大量的时间,因为它消除了以前检查代码的维度:现在只需要让持续集成系统验证gofmt不会产生差异就可以了。

有趣的是,由于在保存文件时编辑器应用了gofmt,这也改变了编写代码的方式。我曾经尝试寻找一些格式化工具,可以查找代码的错误。而现在我可以很快的把我的想法转换成代码,因为gofmt将会让代码变得很漂亮(例如点击Format就可以将我输入的内容进行格式化)。

高质量的代码

我使用了相当多的标准库(文档,源代码),如下所示。

到目前为止,我读过的的标准库代码质量都是非常高的。

例如image/jpeg包:我不知道JPEG是如何工作的,但是一边查看Wikipedia JPEG文章,一边查看image/jpeg代码就可以很容易的理解了。如果这个包再多一些注释的话,我就可以把它作为教学的最佳案例了。

观点

我很赞同Go语言社区的许多观点,例如:

变量名在缺省情况下应该较短,并且在使用名称时,它会变得更具描述性。
保持较小的依赖关系树(在一个合理的程度上):少量的复制比一个小的依赖要好。
引入抽象层是有代价的。Go代码通常相当清晰,代价是有时会重复一些。
参见CodeReviewComments和Go Proverbs。

很少有关键字和抽象层

Go语言的规范只列出了25个关键字,我可以很容易地记住这些关键字。

内置函数和类型也是这样的。

根据我的经验,少量的抽象层和概念可以使语言更易于理解,而且新人可以更快的上手。

说到这一点,我对Go规范的可读性感到惊讶。它似乎是针对程序员(而不是标准委员会?)。

2.速度

快速反馈/低延迟

我喜欢快速反馈:我喜欢那些快速加载的网站和流畅的用户界面,无论什么时候,与功能强大的工具相比,我更愿意选择速度更快的工具。大型web属性的发现证实了很多人都是这么认为的。

Go编译器的作者们尊重我对低延迟的渴望:编译速度对他们来说很重要,在进行新的优化时,是否会减慢编译速度也成为了一个需要考虑的范围。

我的一个朋友以前没有使用过Go语言。在使用goget安装RobustIRC桥之后,他们觉得Go语言肯定是一门解释性语言,我必须纠正他们:不是的,Go编译器就是这么快。

大多数Go工具都不例外,例如gofmt或goimports都是非常快的。

最大的资源使用情况

对于批处理应用程序(相对于交互式应用程序),充分利用可用资源通常比低延迟更重要。

很容易配置和更改一个Go程序来利用所有可用的IOPS、网络带宽或计算。作为一个例子,我写了关于填充一个Gbps链接,并优化了debiman来利用所有可用的资源,减少了它的运行时间。

3.丰富的标准库

Go标准库提供了有效地使用公共通信协议和数据存储格式/机制的方法,如:ip、HTTP、JPEG、SQL……

Go的标准库是我所见过的最好的。我认为它是组织有序的、干净的、体积小、全面的:我经常发现可以用标准的库来编写合理的程序,外加一两个外部包。

特定于领域的数据类型和算法(一般而言)不包括在标准库之外,例如golang.org/x/net/html。在进入标准库之前,golang.org/x名称空间还充当了新代码的登台区域:Go-1兼容性保证排除了任何突发的更改,即使它们显然是有价值的。一个突出的例子是golang.org/x/crypto/ssh,它必须打破现有代码以建立更安全的缺省值。

4.工具

我使用go get工具进行下载、编译、安装和更新Go包。

使用的所有Go代码库都使用内置的testing工具。这不仅在简单快速的测试中得到了结果,而且在覆盖率报告中也很容易得到。

每当一个程序使用比预期更多的资源时,我就启动了pprof。请参阅这篇golang.org的博客文章,关于pprof的介绍,或者关于优化Debian代码搜索的博客文章。导入net/http/pprof 包 后,你可以在运行时配置服务器,无需重新编译或重新启动。

交叉编译就像设置GOARCH环境变量一样简单,例如:GOARCH=arm64,目标是树莓派3。值得注意的是,工具也可以跨平台工作!例如,我可以从amd64电脑中剖析档案gokrazy :go tool pprof ~/go/bin/linux_arm64/dhcp http://gokrazy:3112/debug/pprof/heap

godoc以纯文本形式显示文档,或通过HTTP提供服务。godoc.org是一个公共的实例,但是我运行一个本地的应用程序,可以离线使用,也可以在尚未发布的包中使用。

请注意,这些是使用该语言的标准工具。从C开始,上述每一项都将是一项重要的成就。我们认为他们是理所当然的。

开始

希望我已解释清楚为什么喜欢和Go语言一起工作。

如果你开始感兴趣了,可以看看初学者的资源,这篇文章里面描述了什么时候应该加入到Gophers slack频道。见https://golang.org/help/

警告

当然,没有任何一个编程工具是完全没有问题的。鉴于本文解释的是为什么Go是我最喜欢的编程语言,所以它介绍的都是Go语言积极的一面。不过,我还是会提出一些问题:

  • 由于Go包没有提供稳定的API,你可能需要使用一个特定的、可以工作的版本。最好的选择是dep工具。
  • 惯用的Go代码并不一定会转化为最高的性能机器代码,而运行时则以(很小的)成本为代价。我发现在性能缺乏的罕见情况下,可以求助于cgo或汇编程序。如果你的域是硬实的应用程序或其他性能非常关键的代码,那么可能会有所不同。
  • 我上面提到Go标准库是我所见过的最好的,但这并不意味着它没有任何问题。例如通过一个标准库最古老的包——go/ast,以编程的方式修改代码时,处理注释的方式会变得非常复杂。
Pair programming is a collaborative software development technique where two programmers work together at a single workstation. One programmer, known as the driver, writes the code, while the other, the observer or navigator, reviews each line of code as it is typed in. The two programmers switch roles frequently. The reasons for using pair programming are numerous. Firstly, it enhances code quality. With two minds working on the same code, errors can be caught immediately, and better solutions can be found. The navigator can spot logical flaws, potential bugs, or violations of coding standards while the driver is focused on typing the code. Secondly, it promotes knowledge sharing. Programmers often have different skills, experiences, and perspectives. Through pair programming, they can learn from each other, such as new programming techniques, domain - specific knowledge, or best practices. Thirdly, it improves communication within the development team. Pair programming requires constant communication between the two programmers, which helps build better working relationships and a more collaborative team environment. Finally, it can increase productivity. Although it may seem that having two people work on one task would be less efficient, in the long - run, the reduction in debugging time and the higher quality of code can lead to faster project completion. ```python # Hypothetical function to represent pair programming def pair_programming(driver, navigator): while True: code = driver.write_code() review = navigator.review(code) if review == "Approved": break else: driver.fix_code(review) driver, navigator = navigator, driver ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值