原文地址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同樣,保證併發執行代碼嚴謹性的同時,還能十分優雅。