作者: Jack Wilson


我一直在使用Go语言来完成我以前使用Python的许多任务。

举一些例子:处理存储在S3中的Cloudfront日志

在S3中的存储桶和/或区域之间移动TB级文件

匹配我们的数据库记录和S3之间的文件,确保一切都是同步的。

大多数是一次性任务,这就是脚本语言理想的原因。该程序需要快速编写,然后很可能被丢弃。通常,任务是新的和独特的,因此代码重用是最小的。

使用Go代替Python的优点

编译器很好

我经常在Python中犯下愚蠢的错误。我错误地命名变量或函数,或者传入错误的参数。Devtools可以捕获其中一些,但它们通常需要特殊设置。我从来没有能够轻松配置pylint,而且我不喜欢需要自己配置的完整IDE。

最糟糕的是,如果您输入隐藏在条件逻辑后面的变量。您的脚本可能会在触发错误之前运行几个小时,然后一切都会爆炸,您必须重新启动它。

单元测试可以捕获大部分内容,但是很难获得100%的代码覆盖率,而且我不想花时间为单一脚本编写单元测试。

编译语言会使所有这些问题消失。编译器捕获了你错过的所有愚蠢的东西。因此,我喜欢Go这样的语言超过几百行。

开发速度

拥有编译器的另一面是通常你的开发速度会降低。对于C / C ++和Java来说尤其如此。

Go很简单,我发现开发速度最小。不要误会我的意思,我仍然可以在Python中更快地编写代码,但我可能在Go中实现了85%的Python生产力。

当我考虑到编译器的好处会减少多少错误时,85%也不错。

更好的并行性

您可能知道,Go是从头开始构建的,用于并行执行。

在我的团队中,我们通常需要并行程序,因为我们在S3或数据库中处理大量数据。

如果任务是IO绑定的(很多都是),那么我们就可以成功使用Python线程。但如果它是CPU密集型的,那么Python将因全局解释器锁而受到影响。

我也喜欢在多线程Go中“简单地工作”的简单事情,而不做任何特别的事情。曾经有过这样的问题,你在哪里Ctrl-C你的多线程python并没有做任何事情?

更容易部署

我喜欢有一个二进制文件。我通常在EC2机器上运行代码,使我的脚本更接近S3和我们的数据库。使用Python,我必须确保我需要的所有软件包都安装在远程计算机上,并且我的一个同事没有安装任何冲突的东西。

Virtualenvs解决了大部分问题,但我仍然觉得Go更容易。

通常我会将我的Mac上的代码交叉编译到Linux,将其复制到远程计算机,然后我就开始运行了。我的所有依赖项都包含在我的二进制文件中。

一致的造型。

起初,gofmt工具让我烦恼,特别是他们选择使用制表符而不是空格。我以为这太疯狂了。

但是当我更多地使用它时,我开始依赖它。我开箱即可免费格式化。无论我正在处理什么项目,我的所有代码始终都是一致的,因为格式化是标准Go工具的一个特性。

我必须付出更多努力才能在Python中获得相同的效果。我必须正确配置pylint,然后确保它在每个项目中使用。

更好的工具

Gofmt只是一般主题的一个例子。我喜欢的所有编辑器 - VSCode,vim和Sublime Text都有很好的Golang扩展,可以利用标准的Go工具。

因此,我得到类似于Java的intellisense,但没有使用真正的IDE。我从来没有接近过Python的这种能力。

使用Go代替Python的优点

每当我阅读批评Go的帖子时,通常都是因为缺少明显的特征,比如泛型。我从来没有遇到过丢失泛型的麻烦 - 你会惊讶于你能用地图和切片做多少,但我还有很多其他问题。

Go是固执己见的

首先,Go可能是我用过的最自以为是的语言。从迫使您使用制表符而不是空格(假设您正在使用gofmt),强制您使用某个目录结构,使您在GOPATH环境变量中编写代码,Go的许多功能都不容易更改。

这么容易学习的原因之一是因为你无法改变这些功能。如果你不想导出以大写字母开头的每个名字,那么对你来说太糟糕了。幸运的是,这些都不是我的交易破坏者,但我能理解他们是否适合其他人。相比来说还是Python更灵活。

有点差的库支持

在这个领域比较Python和Go是不公平的。Go是一个更新的,但当我发现Go不支持开箱即用的功能时,我仍然感到困惑。当StackOverflow上的人发布应该是内置函数的代码时,我更加困惑,然后就像每个人将代码复制并粘贴到他们的项目中一样没有问题。

在过去几年中浮现的两个例子:

对切片进行排序(幸运的是,这在Go 1.8中变得更容易)

Math.round只使用整数而不允许你舍入到浮点值(例如,如果你想舍入到最接近的.5)。在Go 1.10之前,甚至没有math.round。

当然,其中一些是因为Go没有泛型,有些是因为Go的开发人员遵循的策略是只向标准库中添加绝对必要的东西。

我理解这两点,但是当你遇到需要自己编码的琐碎功能时,它仍然很烦人。

希望随着语言的不断发展,这些痛点越来越少。