掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
“ “Go will be the server language of the future.[1]” — Tobias Lütke, Shopify

成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒有做好網(wǎng)站,給成都創(chuàng)新互聯(lián)一個(gè)展示的機(jī)會(huì)來證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。
在過去幾年,有一門崛起的新語(yǔ)言:Go 或者 GoLang[2]。沒有什么比一門新的編程語(yǔ)言更令開發(fā)者興奮了,不是么? 因此,我在 4、5 個(gè)月之前開始學(xué)習(xí) Go。在這里我將告訴你,你為什么也要學(xué)習(xí)這門新語(yǔ)言。
在這篇文章中,我不打算教你怎樣寫 “Hello World!!”。網(wǎng)上有許多其他的文章會(huì)教你。我將闡述軟硬件發(fā)展的現(xiàn)狀以及為什么我們要學(xué)習(xí)像 Go 這樣的新語(yǔ)言? 因?yàn)槿绻麤]有任何問題,我們就不需要解決方案,不是么?
硬件的局限性
摩爾定律[3]正在失效。
英特爾公司在 2004 年推出[4]了第一款具有 3.0 GHz時(shí)鐘速度的奔騰 4 處理器。如今,我的 2016款 MacBook Pro[5] 的時(shí)鐘速度為 2.9 GHz。因此,差不多十年,原始處理能力都沒有太多的增加。你可以在下圖中看到處理能力的增長(zhǎng)與時(shí)間的關(guān)系。
從上面的圖表可以看出,單線程的性能和處理器的頻率在近十年幾乎保持穩(wěn)定。如果你認(rèn)為添加更多的晶體管是一種解決問題的方法,那你就錯(cuò)了。這是因?yàn)樵谖⒂^尺度上,量子特性開始顯現(xiàn)(例如:量子隧道穿越),放更多的晶體管代價(jià)也會(huì)越多(為什么?[6]),而且,每美元可以添加晶體管的數(shù)量也開始下降。
所以,針對(duì)上述問題的解決方案如下:
但是,以上方案也有它們自身的限制。我們無法向處理器添加更多的緩存以提升性能,因?yàn)榫彺婢哂形锢硐拗疲壕彺嬖酱螅俣仍铰?。添加更多的?nèi)核到處理器也有它的成本。而且,這也無法無限擴(kuò)展。這些多核處理器能同時(shí)運(yùn)行多個(gè)線程,同時(shí)也能帶來并發(fā)能力。我們稍后會(huì)討論它。
因此,如果我們不能依賴于硬件的改進(jìn),唯一的出路就是找到一個(gè)高效的軟件來提升性能,但遺憾的是,現(xiàn)代編程語(yǔ)言都不是那么高效。
“ “現(xiàn)代處理器就像一輛有氮氧加速系統(tǒng)的直線競(jìng)速賽車,它們?cè)谥本€競(jìng)速賽中表現(xiàn)優(yōu)異。不幸的是,現(xiàn)代編程語(yǔ)言卻像蒙特卡羅賽道,它們有大量的彎道?!?- David Ungar[7]
Go 有 goroutine?。?/strong>
如上所述,硬件提供商正在向處理器添加更多的內(nèi)核以提升性能。所有的數(shù)據(jù)中心都在這些處理器上運(yùn)行,我們應(yīng)該期待在未來幾年內(nèi)核數(shù)量的增長(zhǎng)。更重要的是,如今的應(yīng)用程序都是使用多個(gè)微服務(wù)來維持?jǐn)?shù)據(jù)庫(kù)的連接、消息隊(duì)列和緩存的維護(hù)。因此,我們開發(fā)的軟件和編程語(yǔ)言可以更容易的支持并發(fā),并且它們應(yīng)該隨著內(nèi)核數(shù)量的增長(zhǎng)而可擴(kuò)展。
但是大多數(shù)現(xiàn)代編程語(yǔ)言(如 Java、Python 等)都來自于 90 年代的單線程環(huán)境。這些語(yǔ)言大多數(shù)都支持多線程。但真正的問題是并發(fā)執(zhí)行,線程鎖、競(jìng)爭(zhēng)條件和死鎖。這些問題都使得很難在這些語(yǔ)言上創(chuàng)建一個(gè)多線程的應(yīng)用程序。
例如,在 Java 中創(chuàng)建新的線程會(huì)消耗大量?jī)?nèi)存。因?yàn)槊恳粋€(gè)線程都會(huì)消耗大約 1 MB 大小的堆內(nèi)存,如果你運(yùn)行上千個(gè)線程,他們會(huì)對(duì)堆造成巨大的壓力,最終會(huì)由于內(nèi)存不足而宕機(jī)。此外,你想要在兩個(gè)或者多個(gè)線程之間通信也是非常困難的。
另一方面,Go 于 2009 年發(fā)布,那時(shí)多核處理器已經(jīng)上市了。這也是為什么 Go 是在考慮并發(fā)的基礎(chǔ)上構(gòu)建的。Go 用 goroutine 來替代線程,它們從堆中消耗了大約 2 KB 的內(nèi)存。因此你可以隨時(shí)啟動(dòng)上百萬個(gè) goroutine。
Goroutine 是怎樣工作的呢?參考:http://golangtutorials.blogspot.in/2011/06/goroutines.html
其他的好處:
“ 你能在 Rob Pike 的優(yōu)秀演講并發(fā)不是并行[8]中獲取更深刻理解。
以上這些點(diǎn),能使 Go 能像 Java、C 或者 C++ 一樣擁有強(qiáng)大的并發(fā)處理能力,同時(shí)在保證并發(fā)執(zhí)行代碼嚴(yán)謹(jǐn)性的基礎(chǔ)上,像 Erlang 一樣優(yōu)美。
Go takes good of both the worlds. Easy to write concurrent and efficient to manage concurrency
Go 直接在底層硬件上運(yùn)行
與其他現(xiàn)代高級(jí)語(yǔ)言(如 Java/Python)相比,使用 C、C++ 的最大好處就是它的性能,因?yàn)?C/C++ 是編譯型語(yǔ)言而不是解釋型語(yǔ)言。
處理器能理解二進(jìn)制文件。通常來說,當(dāng)你編譯一個(gè)用 Java 或者其他基于 JVM 的語(yǔ)言構(gòu)建的應(yīng)用程序,它將人類可讀的代碼編譯為字節(jié)代碼,這可以被 JVM 或者在底層操作系統(tǒng)之上運(yùn)行的其他虛擬機(jī)所理解。當(dāng)執(zhí)行的時(shí)候,虛擬機(jī)解釋這些字節(jié)碼并且將他們轉(zhuǎn)化為處理器能理解的二進(jìn)制文件。
基于虛擬機(jī)語(yǔ)言的執(zhí)行步驟
而另一個(gè)方面,C/C++ 不會(huì)在 VM 上執(zhí)行,并且從執(zhí)行周期中刪除(編譯為字節(jié)代碼)這一步提高性能。它直接將人類可讀的代碼編譯為二進(jìn)制文件。
但是,在這些語(yǔ)言中釋放和分配變量是一件極其痛苦的事情。雖然大部分編程語(yǔ)言都使用垃圾回收器或者引用計(jì)數(shù)的算法來處理對(duì)象的分配和移除。
Go 做到了兩全其美,Go 像一些低級(jí)別的語(yǔ)言(如:C/C++ )一樣是一門編譯型語(yǔ)言,這意味著它的性能幾乎接近于低級(jí)別語(yǔ)言,它還用垃圾回收來分配和刪除對(duì)象。因此,不再需要 malloc() 和 free() 聲明了!?。∵@太酷了?。。?/p>
用 Go 編寫的代碼易于維護(hù)
我告訴你一件事,Go 沒有像其他語(yǔ)言一樣瘋狂于編程語(yǔ)法,它的語(yǔ)法非常整潔。
Go 的的設(shè)計(jì)者在谷歌創(chuàng)建這門語(yǔ)言的時(shí)候就考慮到了這一點(diǎn),由于谷歌擁有非常強(qiáng)大的代碼庫(kù),成千上萬的開發(fā)者都工作在相同的代碼庫(kù)上,代碼應(yīng)該易于其他開發(fā)者理解,一段代碼應(yīng)該對(duì)另一段代碼有最小的影響。這些都會(huì)使得代碼易于維護(hù),易于修改。
Go 有意的忽視了許多現(xiàn)代面向?qū)ο笳Z(yǔ)言的一些特性。
以上這些改變使得 Go 與其他語(yǔ)言截然不同,這使得用 Go 編程與其他語(yǔ)言很不一樣。你可能不喜歡以上的一些觀點(diǎn)。但是,并不是說沒有上述這些特性,你就無法對(duì)你的應(yīng)用程序編碼。你要做的就是多寫幾行代碼,但從積極的一面,它將使你的代碼更加清晰,為代碼添加更多的清晰度。
代碼的可讀性和效率的對(duì)比
如上圖所示,Go 幾乎與 C/C++ 一樣高效,同時(shí)像 Ruby、Python 以及其他一些語(yǔ)言一樣保持代碼語(yǔ)法的簡(jiǎn)潔,對(duì)于人類和處理器來說,這是一個(gè)雙贏的局面?。?!
與 Swift 等這些新的語(yǔ)言不一樣[9],Go 的語(yǔ)法非常穩(wěn)定。自從 2012 年首次公開發(fā)布 1.0 版本以來,它保持不變并且向后兼容。
Go 由谷歌背書
結(jié)論

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流