我是靠谱客的博主 幽默夏天,最近开发中收集的这篇文章主要介绍再见,Python!你好,Go语言\n\n,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Go 语言诞生于谷歌,由计算机领域的三位宗师级大牛 Rob Pike、Ken Thompson 和 Robert Griesemer 写成。由于出身名门,Go 在诞生之初就吸引了大批开发者的关注。诞生十年以来,已经涌出了很多基于 Go 的应用。就在不多久之前,知乎也舍弃了Python,转用Go重构推荐系统。

谷歌前员工Jake Wilson认为,比起大家熟悉的 Python,Go 语言其实有很多优良特性,很多时候都可以代替Python,他已经在很多任务中使用Go语言替代了Python。那么Go 语言到底有着什么样的独特魅力?它有哪些胜于 Python 的地方呢?让我们一起来了解一下吧!

2019年程序员最想学习的编程语言

"image"

出身名门的Go语言

对于一门只有十年历史的新语言,Go 的发展势头相当迅猛,容器界的扛把子Docker就是用Go写的,国内也有不少团队广泛使用 Go。近日,HackerRank在社区发起了程序员技能调查,来自 100 多个国家、超过 70000 名开发者参与其中。调查结果显示,2019 年,程序员最想学习的编程语言 Top 3 分别是 Go、Kotlin 和 Python,其中 Go 以 37.2% 的比例排在首位。

"image"

但Go要想撼动编程界的常青树Java二十多年的地位无疑难度颇大。据HackerRank 数据显示,2018 年,Java 在开发者最受欢迎的编程语言排行榜中仍然排名第 2,Python 排名第 4,Go 排名第 13,距离第一名JavaScript还有不小的差距。

但对本文作者Jack Wilson来说,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语言当然也有缺点

我每次看到批评Go语言的文章时,里面讲的几乎都是Go语言对关键特性的缺失,比如泛型。我倒是认为没有泛型没什么影响——你会发现,使用map和切片(slice)就能实现多得惊人的操作。但是我在使用Go语言的过程中遇到了很多其他问题。

缺乏灵活性

首先,Go语言可能是我用过的语言里最“固执”的语言了。比如,它除了会强迫你使用tab而不是空格键缩进(假设你用了gofmt工具),会强迫你使用特定的文件组织结构,还会强迫你在GOPATH环境变量中编程,如此等等。这种语言有太多难以改变的特性了。
Go语言简单易学的原因之一恐怕就是你不能改变这些特性。如果你不愿意将所有首字母大写的变量名export一遍,那真是抱歉了。幸运的是,Go的这些特性倒是没有触犯我的原则底线,但是如果有人认为里面的某些要求根本无法理喻,我也能够理解。
相比之下Python就灵活多了。

库支持有点差劲

在这方面把Go语言和Python做比较有些不公平。Go的出现比Python晚很多,但当我发现有些功能Go居然不支持的时候,还是觉得很困惑。我甚至发现StackOverflow上很多人po出了本应该作为内置功能的代码段,而且大家都需要该功能,纷纷将代码复制粘贴到自己的项目下。这类功能不应该嵌入到语言内部吗?
说到这里,我想到了近几年的两个例子:

  • 给切片排序(幸运的是在Go 1.8版本中这点方便多了)

  • Math.round只支持整数,不能进行浮点数的取整(比如你想找一个最接近0.5的整数,Go语言就无法完成)。甚至在Go 1.10版本之前,根本没有math.round函数

当然,这些问题的原因有一部分是Go语言没有泛型,另一部分是因为Go的开发者们只给Go的标准库中添加最最必要的功能。

这两点我都理解,但是在遇到很小的问题却需要自己写代码解决时还是感到烦恼。

希望随着Go语言的发展,它的问题会变得越来越少。

Go 和 Python 你更喜欢谁?欢迎留言交流!

作者介绍:Jake Wilson,现任 SketchUp web team 技术经理,研究范围包括 HTML5、WebGL、Google Closure、Typescript、Java Redis 后端开发等,从事软件开发、硬件、产品、创业和激励方面的工作。他曾就职于 Boxuno.com、Monolla.com、谷歌等公司。在谷歌,他曾参与 Goole+、chrome、Webmaster Tools 等项目。

原文链接:https://thinkfaster.co/2018/07/goodbye-python-hello-go/

最后

以上就是幽默夏天为你收集整理的再见,Python!你好,Go语言\n\n的全部内容,希望文章能够帮你解决再见,Python!你好,Go语言\n\n所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部