- 原文地址:Why should you learn Go?
- 原文做者:Keval Patel
- 译文出自:掘金翻译计划
- 本文永久连接:github.com/xitu/gold-m…
- 译者:todaycoder001
- 校对者:TokenJan,JackEggie
“Go will be the server language of the future.” — Tobias Lütke, Shopifyhtml
在过去几年,有一门崛起的新语言:Go 或者 GoLang。没有什么比一门新的编程语言更令开发者兴奋了,不是么? 所以,我在 四、5 个月以前开始学习 Go。在这里我将告诉你,你为何也要学习这门新语言。前端
在这篇文章中,我不打算教你怎样写 “Hello World!!”。网上有许多其余的文章会教你。**我将阐述软硬件发展的现状以及为何咱们要学习像 Go 这样的新语言?**由于若是没有任何问题,咱们就不须要解决方案,不是么?android
摩尔定律正在失效。ios
英特尔公司在 2004 年推出了第一款具备 3.0 GHz时钟速度的奔腾 4 处理器。现在,个人 2016款 MacBook Pro 的时钟速度为 2.9 GHz。所以,差很少十年,原始处理能力都没有太多的增长。你能够在下图中看处处理能力的增加与时间的关系。git
从上面的图表能够看出,单线程的性能和处理器的频率在近十年几乎保持稳定。若是你认为添加更多的晶体管是一种解决问题的方法,那你就错了。这是由于在微观尺度上,量子特性开始显现(例如:量子隧道穿越),放更多的晶体管代价也会越多(为何?),并且,每美圆能够添加晶体管的数量也开始降低。github
因此,针对上述问题的解决方案以下:golang
可是,以上方案也有它们自身的限制。咱们没法向处理器添加更多的缓存以提高性能,由于缓存具备物理限制:缓存越大,速度越慢。添加更多的内核处处理器也有它的成本。并且,这也没法无限扩展。这些多核处理器能同时运行多个线程,同时也能带来并发能力。咱们稍后会讨论它。算法
所以,若是咱们不能依赖于硬件的改进,惟一的出路就是找到一个高效的软件来提高性能,但遗憾的是,现代编程语言都不是那么高效。数据库
“现代处理器就像一辆有氮氧加速系统的直线竞速赛车,它们在直线竞速赛中表现优异。不幸的是,现代编程语言却像蒙特卡罗赛道,它们有大量的弯道。” - David Ungar编程
如上所述,硬件提供商正在向处理器添加更多的内核以提高性能。全部的数据中心都在这些处理器上运行,咱们应该期待在将来几年内核数量的增加。更重要的是,现在的应用程序都是使用多个微服务来维持数据库的链接、消息队列和缓存的维护。所以,咱们开发的软件和编程语言能够更容易的支持并发,而且它们应该随着内核数量的增加而可扩展。
可是大多数现代编程语言(如 Java、Python 等)都来自于 90 年代的单线程环境。这些语言大多数都支持多线程。但真正的问题是并发执行,线程锁、竞争条件和死锁。这些问题都使得很难在这些语言上建立一个多线程的应用程序。
例如,在 Java 中建立新的线程会消耗大量内存。由于每个线程都会消耗大约 1 MB 大小的堆内存,若是你运行上千个线程,他们会对堆形成巨大的压力,最终会因为内存不足而宕机。此外,你想要在两个或者多个线程之间通讯也是很是困难的。
另外一方面,Go 于 2009 年发布,那时多核处理器已经上市了。这也是为何 Go 是在考虑并发的基础上构建的。Go 用 goroutine 来替代线程,它们从堆中消耗了大约 2 KB 的内存。所以你能够随时启动上百万个 goroutine。
其余的好处:
你能在 Rob Pike 的优秀演讲并发不是并行中获取更深入理解。
以上这些点,能使 Go 能像 Java、C 或者 C++ 同样拥有强大的并发处理能力,同时在保证并发执行代码严谨性的基础上,像 Erlang 同样优美。
与其余现代高级语言(如 Java/Python)相比,使用 C、C++ 的最大好处就是它的性能,由于 C/C++ 是编译型语言而不是解释型语言。
处理器能理解二进制文件。一般来讲,当你编译一个用 Java 或者其余基于 JVM 的语言构建的应用程序,它将人类可读的代码编译为字节代码,这能够被 JVM 或者在底层操做系统之上运行的其余虚拟机所理解。当执行的时候,虚拟机解释这些字节码而且将他们转化为处理器能理解的二进制文件。
而另外一个方面,C/C++ 不会在 VM 上执行,而且从执行周期中删除(编译为字节代码)这一步提升性能。它直接将人类可读的代码编译为二进制文件。
可是,在这些语言中释放和分配变量是一件极其痛苦的事情。虽然大部分编程语言都使用垃圾回收器或者引用计数的算法来处理对象的分配和移除。
Go 作到了一箭双鵰,Go 像一些低级别的语言(如: C/C++ )同样是一门编译型语言,这意味着它的性能几乎接近于低级别语言,它还用垃圾回收来分配和删除对象。所以,再也不须要 malloc() 和 free() 声明了!!!这太酷了!!!
我告诉你一件事,Go 没有像其余语言同样疯狂于编程语法,它的语法很是整洁。
Go 的的设计者在谷歌建立这门语言的时候就考虑到了这一点,因为谷歌拥有很是强大的代码库,成千上万的开发者都工做在相同的代码库上,代码应该易于其余开发者理解,一段代码应该对另外一段代码有最小的影响。这些都会使得代码易于维护,易于修改。
Go 有意的忽视了许多现代面向对象语言的一些特性。
以上这些改变使得 Go 与其余语言大相径庭,这使得用 Go 编程与其余语言很不同。你可能不喜欢以上的一些观点。可是,并非说没有上述这些特性,你就没法对你的应用程序编码。你要作的就是多写几行代码,但从积极的一面,它将使你的代码更加清晰,为代码添加更多的清晰度。
如上图所示,Go 几乎与 C/C++ 同样高效,同时像 Ruby、Python 以及其余一些语言同样保持代码语法的简洁,对于人类和处理器来讲,这是一个共赢的局面!!!
与 Swift 等这些新的语言不同,Go 的语法很是稳定。自从 2012 年首次公开发布 1.0 版本以来,它保持不变而且向后兼容。
~若是你喜欢这篇文章,点击下方的💚以便于更多的人看到它!此外,你也能够在 Medium 或者个人博客关注我,以便于你及时获取 Go 的更新的文章!!~
若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。
掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、设计、人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划、官方微博、知乎专栏。