Go语言诞生于谷歌,由Rob Pike、Ken Thompson和Robert Griesemer三位计算机科学硕士撰写。由于其知名度,Go自成立以来就引起了众多开发者的关注。自从它10年前诞生以来,许多基于Go的应用程序已经出现。不久前,知乎放弃了python,用go来重建推荐系统。
Google的前雇员Jake wilson认为,与熟悉的python相比,go语言有许多好的特性,在许多情况下可以取代python。在许多任务中,他用Go语言取代了Python。那么,Go语言的独特魅力是什么呢?什么比Python更好?让我们一起了解。
2019 年程序员最想学习的编程语言
出身名门的 Go 语言
对于一种只有十年历史的新语言来说,Go正在迅速发展。作为容器界的扛把子,Docker就是用go写的,中国还有很多团队都广泛使用go。最近,Hackrank发起了一项针对程序员技能的社区调查,涉及100多个国家的70000多名开发人员。调查结果显示,2019年,程序员最想学习的三种编程语言是Go、Kotlin和Python,Go排名第一,占37.2%。
但是,在20年内,动摇编程世界中的常青树Java的地位无疑是困难的。根据HackerRank的数据,在2018,Java仍然排名第2,在最流行的编程语言开发人员中,Python排名第4位,Go排名第13位,与1号JavaScript仍然有很大差距。
但对 本人来说,Go 语言虽然“年纪尚小”,但已经拥有很多非常优秀的特性。
Go 语言到底好在哪?
在很多任务上,我已经用 Go 语言代替了 Python,举几个例子:
· 处理储存在 S3 上的云端日志
· 在 S3 上的 bucket 和 / 或 region 之间移动 TB 级别大小的文件
· 匹配本地的数据库记录和 S3 上的文件,以保证文件处于同步状态
这些任务大多是一次性的,所以使用脚本语言操作就会比较合适。这些任务需要快速地编程,而代码用过一次一般就舍弃了。一般来说,这种任务的需求都比较新颖、比较专,其代码很少需要复用。下面就来介绍一下,针对这种任务为什么可以用 Go 语言来替代 Python。
拥有编译器很方便
我经常在写 Python 时犯很低级的错误。我会给变量或函数命错名,或向它们传递错误的参数。这样的错误用调试工具可以找出一部分,但这种工具一般需要专门设置。我从来没很方便地配置过 pylint,而且我也不喜欢用那些很重的、配置起来更麻烦的 IDE。最惨的情况是,你可能会不小心打错变量名,而这种错误又不太容易发现。你的脚本可能会跑好几个小时才遇上这个错误,然后一切都崩溃了,你又得从头开始跑这个脚本。这种错误大部分都可以靠单元测试检出,但单元测试很少能覆盖 100% 的代码,而且我并不想浪费时间去给一个只用一次的脚本写单元测试。而带编译器的语言就可以解决以上所有问题。编译器可以检测出你犯的所有低级错误。出于这点原因,我在写长达几百行的代码时,更倾向于使用 Go 这类语言。
开发速度
然而,需要编译的语言的一个缺点是,一般你的开发速度会下降。这点在 C/C++ 和 Java 等语言上体现得尤其明显。而 Go 是一个非常简单的语言,我发现它的开发速度并没有被拖慢多少。不要误会,我的意思并不是说它比 Python 还快,而是想说,用 Go 语言没有比 Python 慢很多,一般达到使用 Python 开发速度的 85% 还是没问题的。相对于拥有编译器能避免的那些低级错误来说,我认为牺牲 15% 的开发速度还是很值的。
更好的并行性
你可能已经知道,Go 语言就是为并行而生的。在我的团队里经常会需要并行程序,因为我们要在 S3上操作我们数据库中大量的数据。如果该任务是 IO 密集型的(实际上很多任务都是),我们就可以很容易地部署 Python 线程。但如果任务是 CPU 密集型的,用 Python 就比较不方便了,因为有全局解释器锁的存在。我非常享受在 Go 语言中简单代码不用修改就能直接多线程运行的爽快感。不知你在 Python 中有没有遇到过这种问题:直接复制粘贴的多线程代码却完全不工作。在 Go 语言中就不会有此问题。
部署简单
我个人比较喜欢把所有依赖放在单个二进制文件里。我经常在 EC2 服务器上运行自己的脚本,好让环境更加接近我们在 S3 上的服务器。如果用 Python 的话,我需要保证所有需要的包都在服务器上装好,而且我的同事不能在服务器上装任何可能产生冲突的包。虚拟环境可以解决大部分问题,但我还是觉得用Go 语言更方便。我一般是在 Mac 和 Linux 上交叉编译我的代码,将其拷贝到远程服务器上,然后就可以任其运行了。我的代码所需要的所有依赖都在一个二进制文件里。
风格一致
起初,Go语言的格式化工具gofmt让我哭笑不得,尤其是当它需要tab 键而不是空格键来进行缩进时。我觉得这实在太痛苦了。但一段时间后,我开始“真香”了。当我编写代码时,我可以以格式做所有事情。格式化工具将帮助我做所有事情。我的所有代码样式都是一致的,即使我正在编写不同的项目。这是因为格式化是标准Go工具的一个特性。但是如果我想在Python中实现这一点,我必须努力工作。我需要正确配置pylint工具,并确保在每个项目中都使用它。
更便捷的工具
Gofmt 只是 Go 语言众多工具中的一个小例子。所有我喜欢用的编辑器——VSCode,vim 和 Sublime Text 中,都有 Go 语言相应的扩展,让我能够方便地享受到 Go 工具的优点。这样,我就能获得写 Java 时的那种智能体验,却不需要真正使用一个 IDE。我在用 Python 时从未获得过这种体验。
Go 和 Python 你更喜欢谁?欢迎留言交流!