[译]为何你应该学习Go语言?(上)

原文地址golang

“Go将成为将来的服务端语言。” --Tobias Lütke, Shopify数据库

在过去的几年中,崛起了一门新的语言:Go,也称做GoLang。做为一名开发者,没有什么比一门新的编程语言更让人兴奋的了,因此,我在四五个月以前开始了Go的学习。经过本文,我将告诉你,为何你也应该来学习这门新的编程语言。编程

在本文中,我不会教你如何写出"Hello World!!"。这样的教程网络上已经有不少了。我将在本文中阐述,软硬件目前的发展示状,以及,在这样的形势下,咱们为何要学习像Go这样的新语言。由于存在问题,因此须要找到解决方案。缓存

硬件的局限性

摩尔定律在失效。安全

2004年,英特尔公司推出了第一款具有3.0GHz主频的奔腾4处理器。而现在,个人2016款Macbook Pro也只有2.9GHz的主频。所以,原始处理能力在过去的十年中,基本没有什么提高。下图清晰地展现了处理能力的增加与时间之间的关系。 网络

从上图中咱们能够看出,单线程的性能和处理器的频率在近十年的增加几乎持平。若是你认为添加更多的晶体管能够解决的话,那你就错了。由于在微观尺度上,量子特性开始显现(例如:量子隧道穿越),放更多的晶体管成本也会越高( 为何?),而且,单位美圆能够添加的晶体管数量也开始降低。

因此,针对上述问题,解决方案以下:数据结构

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

可是以上方案自身也存在局限性。因为缓存自身的物理限制:缓存越大,速度越慢,因此咱们没法一直向处理器增长缓存来提高性能。向处理器添加更多的内核也存在它的成本。这样的扩展也是有限的。这些多核处理器能够同时运行多个线程,从而实现了并发性。咱们稍后会讨论它。多线程

所以,若是咱们没法依赖于硬件提高,那惟一的出路只能是经过更高效的软件来提高性能。但遗憾的是,现代编程语言都不过高效。并发

“Modern processors are a like nitro fueled funny cars,they excel at the quarter mile. Unfortunately modern programming languages are like Monte Carlo,they are full of twists and turns.” --David Ungar编程语言

Go 拥有 goroutine!!

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

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

例如,在 Java 中建立新的线程,内存的利用率并不高效。每一个线程会消耗大约 1 MB 的堆内存,最终,若是你运行了上千个线程,他们会对堆带来巨大的压力,而且会因为内存不足而宕机。另外,你想要在两个或者多个线程之间通讯,也是很是困难的。

另外一方面,Go 于 2009 年发布,这时多核处理器已经可用了。这也是为何 Go 在构建时会考虑保证并发性。Go 拥有 goroutine 来替代线程,单个goroutine消耗大约 2 KB 的堆内存。所以,你能够随时启动上百万个 goroutine。

其余好处:

  • Goroutine 具备可伸缩的分段堆栈(版本1.4之后,已改成连续栈),这意味着在须要的时候才会使用更多的内存。
  • Goroutine 比线程启动得更快。
  • Goroutine 自带安全通讯协议,channels。
  • Goroutine 容许你在共享数据结构时避免使用互斥锁。
  • 此外,goroutine 和系统线程没有1:1的映射关系。单个goroutine能在多个线程上运行。Goroutine 也能被复用到少数的系统线程上。

你能够经过 Rob Pike 的演讲并发不是并行加深理解。

基于以上几点,使 Go 能像 Java、C 或者 C++ 同样拥有强大的并发处理能力,并且能像Erlang同样,保证并发执行代码严谨性的同时,还能十分优雅。

相关文章
相关标签/搜索