Go语言诞生于谷歌,由计算机领域的三位大师RobPike、KenThompson和RobertGriesemer共同编写。由于出身名门,Go从一开始就吸引了大批开发者的关注。在它诞生的十年间,出现了很多基于Go的应用。前不久,知乎也抛弃了Python,改用Go来重构推荐系统。谷歌前员工JakeWilson认为,与大家熟悉的Python相比,Go语言其实有很多优秀的特性,在很多情况下可以替代Python。他在许多任务中使用Go语言替代Python。那么Go语言有什么样的独特魅力呢?它比Python有什么优势?一起来一探究竟吧!出身名门的Go语言,对于一门只有十年的新语言来说,发展势头不小。很快,容器界的老大Docker就是用Go写的,国内很多团队都大量使用Go。近日,HackerRank在社区发起了一项程序员技能调查,有来自100多个国家的70,000多名开发者参与。调查结果显示,2019年,程序员最想学习的前3大编程语言分别是Go、Kotlin和Python,其中Go以37.2%的比例位居榜首。但Go想要撼动编程界二十多年来常青树Java的地位,无疑是相当困难的。根据HackerRank数据,2018年,Java在开发者最喜爱的编程语言中仍然排名第2,Python第4,Go第13,与排名第一的JavaScript仍有较大差距。但对于本文作者JackWilson来说,Go语言虽然“还年轻”,但已经具备了很多优秀的特性。Go有什么好?我使用Go而不是Python来完成许多任务,仅举几例:处理存储在S3上的云日志在S3上的存储桶和/或区域之间移动太字节文件匹配本地数据库记录和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上交叉编译我的代码,将其复制到远程服务器,然后让它运行。我的代码需要的所有依赖项都在一个二进制文件中。一致的风格Gofmt,Go的格式化程序,一开始真的让我抓狂,尤其是当缩进代码时它需要tab键而不是空格键。我认为这太疯狂了。但是用了一段时间后,就开始“真香”了。当我编写代码时,我可以随心所欲地进行格式化,而格式化程序会为我做这一切。我所有的代码风格都是一致的,即使我在编写不同的项目时也是如此。这是因为格式化是标准Go工具的一项功能。但如果我想在Python中实现这一点,我将不得不付出一些努力。我需要正确配置pylint工具并确保在每个项目中都使用它。更方便的工具Gofmt只是Go语言众多工具中的一个小例子。我最喜欢的编辑器——VSCode、vim和SublimeText——都对Go语言进行了相应的扩展,让我可以轻松享受Go工具的优势。这样,我就可以在不实际使用IDE的情况下获得编写Java的智能体验。我从未有过使用Python的经验。当然,Go语言也有缺点。每次看到批评Go语言的文章,几乎都是在说Go语言缺少关键特性,比如泛型。我不认为没有泛型会有什么不同——你会发现你可以用映射和切片做大量的操作。但是我在使用Go语言的过程中遇到了很多其他的问题。缺乏灵活性首先,Go语言可能是我用过的最“顽固”的语言。例如,除了强制你使用制表符而不是空格进行缩进(假设你使用gofmt工具),它会强制你使用特定的文件组织结构,它会强制你在GOPATH环境变量中编程,以及很快。这种语言有太多难以改变的特性。也许Go如此容易学习的原因之一是您无法更改这些功能。抱歉,如果您不想导出所有大写的变量名。幸运的是,Go的这些特性并没有触犯我的原则底线,但如果有人认为某些要求根本不合理,我也能理解。相比之下,Python就灵活多了。库支持有点差在这方面将Go与Python进行比较是不公平的。Go出现的时间比Python晚很多,但当我发现Go不支持某些功能时,我仍然感到困惑。我什至发现StackOverflow上很多人贴出了应该是内置函数的代码片段,大家需要这个功能,把代码复制粘贴到自己的项目中。这种功能不应该嵌入到语言中吗?说到这里,我想到了近几年的两个例子:对切片进行排序(幸好在Go1.8中方便多了)Math.round只支持整数,不能进行浮点数的舍入(比如你想找一个最接近0.5的整数,Go语言无法完成)。甚至在Go的1.10版本之前,根本就没有math.round函数。当然,造成这些问题的原因一部分是因为Go语言没有泛型,一部分是因为Go开发者只在Go标准库中添加了最需要的函数。.这两点我都明白,但是遇到一个小问题却需要自己写代码解决的时候还是觉得很烦。希望随着Go语言的发展,问题会越来越少。你更喜欢哪个,Go还是Python?欢迎留言交流!
