[译] 为何你要学习 Go?

为何你要学习 Go?

Image from: [http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682](http://kirael-art.deviantart.com/art/Go-lang-Mascot-458285682)

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

  • 厂商开始向处理器添加愈来愈多的内核。现在,咱们已经有四核和八核的 CPU 可用。
  • 咱们还引入了超线程技术。
  • 为处理器添加更多的缓存以提高性能。

可是,以上方案也有它们自身的限制。咱们没法向处理器添加更多的缓存以提高性能,由于缓存具备物理限制:缓存越大,速度越慢。添加更多的内核处处理器也有它的成本。并且,这也没法无限扩展。这些多核处理器能同时运行多个线程,同时也能带来并发能力。咱们稍后会讨论它。算法

所以,若是咱们不能依赖于硬件的改进,惟一的出路就是找到一个高效的软件来提高性能,但遗憾的是,现代编程语言都不是那么高效。数据库

“现代处理器就像一辆有氮氧加速系统的直线竞速赛车,它们在直线竞速赛中表现优异。不幸的是,现代编程语言却像蒙特卡罗赛道,它们有大量的弯道。” - David Ungar编程

Go 有 goroutine!!

如上所述,硬件提供商正在向处理器添加更多的内核以提高性能。全部的数据中心都在这些处理器上运行,咱们应该期待在将来几年内核数量的增加。更重要的是,现在的应用程序都是使用多个微服务来维持数据库的链接、消息队列和缓存的维护。所以,咱们开发的软件和编程语言能够更容易的支持并发,而且它们应该随着内核数量的增加而可扩展。

可是大多数现代编程语言(如 Java、Python 等)都来自于 90 年代的单线程环境。这些语言大多数都支持多线程。但真正的问题是并发执行,线程锁、竞争条件和死锁。这些问题都使得很难在这些语言上建立一个多线程的应用程序。

例如,在 Java 中建立新的线程会消耗大量内存。由于每个线程都会消耗大约 1 MB 大小的堆内存,若是你运行上千个线程,他们会对堆形成巨大的压力,最终会因为内存不足而宕机。此外,你想要在两个或者多个线程之间通讯也是很是困难的。

另外一方面,Go 于 2009 年发布,那时多核处理器已经上市了。这也是为何 Go 是在考虑并发的基础上构建的。Go 用 goroutine 来替代线程,它们从堆中消耗了大约 2 KB 的内存。所以你能够随时启动上百万个 goroutine。

Goroutine 是怎样工做的呢?参考:[http://golangtutorials.blogspot.in/2011/06/goroutines.html](http://golangtutorials.blogspot.in/2011/06/goroutines.html)

其余的好处:

  • Goroutine 具备可增加的分段堆栈,这意味着它只会在须要的时候才会使用更多的内存。
  • Goroutine 比线程启动的更快。
  • Goroutine 带有内置原语,能够在它们(通道)之间安全的进行通讯。
  • Goroutine 容许你在共享数据结构时避免使用互斥锁。
  • 此外,goroutine 和系统线程没有 1:1 的映射。单个 goroutine 能在多个线程上运行。Goroutine 也能被复用到少许的系统线程上。

你能在 Rob Pike 的优秀演讲并发不是并行中获取更深入理解。

以上这些点,能使 Go 能像 Java、C 或者 C++ 同样拥有强大的并发处理能力,同时在保证并发执行代码严谨性的基础上,像 Erlang 同样优美。

Go takes good of both the worlds. Easy to write concurrent and efficient to manage concurrency

Go 直接在底层硬件上运行

与其余现代高级语言(如 Java/Python)相比,使用 C、C++ 的最大好处就是它的性能,由于 C/C++ 是编译型语言而不是解释型语言。

处理器能理解二进制文件。一般来讲,当你编译一个用 Java 或者其余基于 JVM 的语言构建的应用程序,它将人类可读的代码编译为字节代码,这能够被 JVM 或者在底层操做系统之上运行的其余虚拟机所理解。当执行的时候,虚拟机解释这些字节码而且将他们转化为处理器能理解的二进制文件。

基于虚拟机语言的执行步骤

而另外一个方面,C/C++ 不会在 VM 上执行,而且从执行周期中删除(编译为字节代码)这一步提升性能。它直接将人类可读的代码编译为二进制文件。

可是,在这些语言中释放和分配变量是一件极其痛苦的事情。虽然大部分编程语言都使用垃圾回收器或者引用计数的算法来处理对象的分配和移除。

Go 作到了一箭双鵰,Go 像一些低级别的语言(如: C/C++ )同样是一门编译型语言,这意味着它的性能几乎接近于低级别语言,它还用垃圾回收来分配和删除对象。所以,再也不须要 malloc() 和 free() 声明了!!!这太酷了!!!

用 Go 编写的代码易于维护

我告诉你一件事,Go 没有像其余语言同样疯狂于编程语法,它的语法很是整洁。

Go 的的设计者在谷歌建立这门语言的时候就考虑到了这一点,因为谷歌拥有很是强大的代码库,成千上万的开发者都工做在相同的代码库上,代码应该易于其余开发者理解,一段代码应该对另外一段代码有最小的影响。这些都会使得代码易于维护,易于修改。

Go 有意的忽视了许多现代面向对象语言的一些特性。

  • 没有类。 全部代码都仅用 package 分开,Go 只有结构体而不是类。
  • 不支持继承。 这将使得代码易于修改。在其余语言中,如: Java/Python,若是类 ABC 继承类 XYZ 而且你在类 XYZ 中作了一些改动,那么这可能会在继承类 XYZ 的其余类中产生一些反作用。经过移除继承,Go 也使得理解代码变得很容易 (由于当你在看一段代码时不须要同时查看父类)
  • 没有构造方法。
  • 没有注解。
  • 没有泛型。
  • 没有异常。

以上这些改变使得 Go 与其余语言大相径庭,这使得用 Go 编程与其余语言很不同。你可能不喜欢以上的一些观点。可是,并非说没有上述这些特性,你就没法对你的应用程序编码。你要作的就是多写几行代码,但从积极的一面,它将使你的代码更加清晰,为代码添加更多的清晰度。

代码的可读性和效率的对比

如上图所示,Go 几乎与 C/C++ 同样高效,同时像 Ruby、Python 以及其余一些语言同样保持代码语法的简洁,对于人类和处理器来讲,这是一个共赢的局面!!!

与 Swift 等这些新的语言不同,Go 的语法很是稳定。自从 2012 年首次公开发布 1.0 版本以来,它保持不变而且向后兼容。

Go 由谷歌背书

  • 我知道这不是一个直接的技术优点,但 Go 是由谷歌设计并支持的,谷歌拥有世界上最大的云基础设施之一,而且规模庞大。谷歌设计 Go 以解决可扩展性和有效性问题。这些是建立咱们本身的服务器时都会遇到的问题。
  • Go 更多的也是被一些大公司所使用,如 Adobe、BBC、IBM,因特尔甚至是 Medium(来源:github.com/golang/go/w…)

结论

  • 尽管 Go 与其余面向对象的语言很是不一样,但他一样产生了巨大的影响。Go 提供了像 C/C++ 同样的高性能,像 Java 同样高效的并发处理以及像 Python/Perl 同样的编码乐趣。
  • 若是你没有任何学习 Go 的计划,我将仍然会说硬件的限制会给咱们带来压力,软件开发者应该写超高效的代码。开发者应该理解硬件并相应的优化他们的程序。优化的软件能运行在更廉价或者更慢的机器上(例如物联网设备),而且总体上对最终用户体验有更好的影响。

~若是你喜欢这篇文章,点击下方的💚以便于更多的人看到它!此外,你也能够在 Medium 或者个人博客关注我,以便于你及时获取 Go 的更新的文章!!~

参考文献

若是发现译文存在错误或其余须要改进的地方,欢迎到 掘金翻译计划 对译文进行修改并 PR,也可得到相应奖励积分。文章开头的 本文永久连接 即为本文在 GitHub 上的 MarkDown 连接。


掘金翻译计划 是一个翻译优质互联网技术文章的社区,文章来源为 掘金 上的英文分享文章。内容覆盖 AndroidiOS前端后端区块链产品设计人工智能等领域,想要查看更多优质译文请持续关注 掘金翻译计划官方微博知乎专栏

相关文章
相关标签/搜索