原文地址golang
“Go将成为将来的服务端语言。” --Tobias Lütke, Shopify数据库
在过去的几年中,崛起了一门新的语言:Go,也称做GoLang。做为一名开发者,没有什么比一门新的编程语言更让人兴奋的了,因此,我在四五个月以前开始了Go的学习。经过本文,我将告诉你,为何你也应该来学习这门新的编程语言。编程
在本文中,我不会教你如何写出"Hello World!!"。这样的教程网络上已经有不少了。我将在本文中阐述,软硬件目前的发展示状,以及,在这样的形势下,咱们为何要学习像Go这样的新语言。由于存在问题,因此须要找到解决方案。缓存
摩尔定律在失效。安全
2004年,英特尔公司推出了第一款具有3.0GHz主频的奔腾4处理器。而现在,个人2016款Macbook Pro也只有2.9GHz的主频。所以,原始处理能力在过去的十年中,基本没有什么提高。下图清晰地展现了处理能力的增加与时间之间的关系。 网络
因此,针对上述问题,解决方案以下:数据结构
可是以上方案自身也存在局限性。因为缓存自身的物理限制:缓存越大,速度越慢,因此咱们没法一直向处理器增长缓存来提高性能。向处理器添加更多的内核也存在它的成本。这样的扩展也是有限的。这些多核处理器能够同时运行多个线程,从而实现了并发性。咱们稍后会讨论它。多线程
所以,若是咱们没法依赖于硬件提高,那惟一的出路只能是经过更高效的软件来提高性能。但遗憾的是,现代编程语言都不过高效。并发
“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编程语言
如上所述,硬件厂商经过向处理器添加更多的内核来提高性能。全部的数据中心都运行在这些处理器上,咱们应该期待在将来几年内核数量的增加。更进一步,现在的应用程序均使用多个微服务来维持数据库的链接、消息队列和保持缓存。所以,咱们开发的软件和编程语言应该更容易支持并发,而且,随着内核数量的增加,它们应该是可扩展的。
可是,大多数现代编程语言(如 Java、Python 等)均来自于90年代的单线程环境。这些语言虽然大都支持多线程,但真正的问题是并发执行、线程锁、竞争条件和死锁。这些问题使得很难在这些语言上建立一个多线程应用。
例如,在 Java 中建立新的线程,内存的利用率并不高效。每一个线程会消耗大约 1 MB 的堆内存,最终,若是你运行了上千个线程,他们会对堆带来巨大的压力,而且会因为内存不足而宕机。另外,你想要在两个或者多个线程之间通讯,也是很是困难的。
另外一方面,Go 于 2009 年发布,这时多核处理器已经可用了。这也是为何 Go 在构建时会考虑保证并发性。Go 拥有 goroutine 来替代线程,单个goroutine消耗大约 2 KB 的堆内存。所以,你能够随时启动上百万个 goroutine。
你能够经过 Rob Pike 的演讲并发不是并行加深理解。
基于以上几点,使 Go 能像 Java、C 或者 C++ 同样拥有强大的并发处理能力,并且能像Erlang同样,保证并发执行代码严谨性的同时,还能十分优雅。