為什麼你要學習Go語言?「譯」

📂 best365从哪能进去 ⏳ 2025-07-28 01:31:21 👽 admin 👁️ 9972 💾 135
為什麼你要學習Go語言?「譯」

這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

原文連結 原文作者:Keval Patel

今天在Medium看到一篇“Why should you learn Go?”,自己也是處在學習Golang的初級階段,覺得這篇文章對初學者有很大的益處,獲得原作者的同意後,決定把它翻譯成中文。譯者水平可能不高,文章如有錯誤,請指正,本人感激不盡。

“Go will be the server language of the future.” — Tobias Lütke, Shopify

在過去的幾年裡,有一種新的程式設計語言熱度在持續地上漲:Go或者叫Golang。唯一能讓程式員瘋狂的事,只有新出的程式設計語言了,對吧?因此,四五個月之前我就開始學習Go語言,並且打算告訴你為什麼你也應該學習這門新語言。

在這篇文章中,我不是要教你如何寫”Hello World!“,網上有很多這樣的教程。接下來我將闡述當前電腦硬體-軟體所處的階段以及為什麼我們需要類似Go的新語言。也許我們認為,沒有出現問題,所以我們也不需要解決,這樣的想法對嗎?

硬體限制:

摩爾定律 正在失效。

2004年英特爾推出了第一款具有3.0GHz速度的Pentium 4處理器。今天,我的Macbook Pro 2016已經有了2.9GHz的速度。在這十年間,原生的處理速度並沒有多大的進步。在下表中你可以看到這期間處理能力的對照情況。

從可以看出,單線程效能和處理器的頻率在近十年內保持穩定。如果你認為增加更多的晶體管是解決方案,那麼你就錯了。這是因為在更小規模的情況下一些量子特性開始出現(如隧道),也因為它實際上要投入更多的晶體管(為什嗎?),並且每美元增加晶體管的數量開始下降。

因此,對於上述問題的解決方案,

· 製造商開始加入越來越多核心處理器。現在我們有四核和八核CPU可用。

· 我們還推出了超執行緒技術。

· 為處理器增加更多的緩衝提高效能。

但是,上述的解決方案本身的局限性太大。我們不能通過為處理器添加越來越多的緩衝來提高性,因為緩衝有物理極限:緩衝越大,速度月滿。處理器添加更多核心也有其成本。此外,不能擴充到無限。這些多核處理器可以同時運行多個線程,並帶來並發。我們將在後面討論。

所以,如果我們不能依靠硬體的改進,提高效能的唯一辦法就是更有效軟體。但可悲的是,現代的程式設計語言的效率都不太高。

“現代處理器就像加滿硝基燃料的汽車,它他們擅長的四分之一英裡。不幸的是現代程式設計語言都像蒙特卡洛,他們充滿曲折。“ — David Ungar

Go有go協程!!

正如我們上面所討論的,硬體廠商正在給處理器添加更多核心來提高效能。所有的資料中心都在這些處理器上運行,我們應該期待在未來幾年核心數量能夠增加。如今的應用更多地使用多個微服務維護的資料庫連接,訊息佇列和維護緩衝。因此,我們開發的軟體和程式設計語言應該很支援並發,並且它們應該支援核心的數量的擴充。

但是,大多數現代程式設計語言(如Java,Python等)誕生於上世紀90年代的單線程環境,這些程式設計語言大多數支援多線程。但真正的問題是並發執行,線程鎖,競爭條件和死結。這些問題導致了很難用那些語言建立多線程應用程式。

舉個例子,使用Java建立新的線程在記憶體上並不高效。每個線程佔用的記憶體堆大小約為1MB,如果你開啟數千個線程,就會讓堆承受巨大的壓力,將會由於記憶體不足導致關閉。另外,如果你想兩個或多個線程之間進行通訊,這是非常困難的。

另一方面,Go語言是在2009年發布的,此時多核心處理器已經可用。這就是為什麼Go在語言層次上支援並發,Go有go協程而不是線程。他們消耗的堆記憶體幾乎只有2KB。所以,你可以隨時啟動數百萬的go協程。

其他的優點:

· go協程有可增長的分段堆棧。這意味著,他們只在需要的時候才會使用更多的記憶體。

· go協程比線程啟動更快。

· go協程配備了內建的原語,可以使它們(通道)之間的通訊變得安全。

· go協程讓你避免在共用資料結構時採取互斥鎖。

· 此外,夠程和OS線程不必1對1的映射。單個go協程可以在多個線程運行。go協程可以複用成少數OS線程。

你可以在的Rob Pike的演講並發不是並行 獲得關於go協程更深的理解。

以上各點,讓Go可以像Java,C和C ++高效處理並發,同時像Earlang以簡潔直觀的代碼執行並發。

Go兼顧了這兩方面的特點。容易編寫並發,高效管理並發。

Go直接在底層運行

使用C,C ++而不是其他現代進階語言如Java / Python中的一個最顯著的好處是它們的效能。因為C / C ++編譯型的而不是解釋解釋型的。

處理器理解二進位。一般來說,當你建立一個使用Java或其他基於JVM的語言的程式,當你編譯你的項目,它把人類可讀的代碼編譯成JVM或於底層的作業系統上啟動並執行其他虛擬機器可以理解的位元組碼。執行期間,虛擬機器解釋那些位元組碼並將它們轉換成可以被處理器理解的二進位檔案。

基於VM語言的執行步驟

另一方面,C / C ++不在虛擬機器上執行並且去除這一層次以提高效能。它直接把人類可讀代碼編譯成二進位檔案。

基於二進位檔案的執行步驟

然而,在這些語言中釋放和分配變數是一個巨大的痛苦,儘管大多數程式設計語言使用垃圾收集器或引用計數演算法來處理對象的分配和釋放。

Go語言兼顧了這兩個方面。Go像C / C ++等低級語言,是編譯型語言。這意味著效能幾乎接近低級語言。它還使用垃圾收集來分配和清除的對象。因此,沒有更多的malloc()和free()語句!酷!!!

Go代碼易於維護

讓我告訴你一件事。Go沒有其它語言一樣瘋狂的編程文法。它的文法非常整潔,乾淨。

Go語言的Google設計者在創造這門語言的時候已經想到了這個事情。隨著Google有非常龐大的程式碼程式庫和數以千計的開發人員正在處理相同的程式碼程式庫,代碼應該很簡單讓其他開發人員理解並且一個程式碼片段應該對代碼的另一段的副作用應當最小。這將使代碼易於維護,易於修改。

Go故意遺漏了現代OOP語言的許多特性。

· 沒有類。所有的事情僅劃分成包。同時,Go用結構體替代了類。

· 不支援繼承。這將使代碼易於修改。像Java / Python語言,如果ABC類繼承的XYZ類並且你改動了XYZ類,那麼可能在繼承了XYZ的其他類中產生一些副作用。通過刪除繼承,我們可以很容易地理解代碼同時(因為當看一段代碼時,不用當成超類來看待)。

· 沒有建構函式。

· 沒有註解。

· 沒有泛型。

· 沒有exceptions(應該指的是像ava的錯誤類型)。

上述變化使Go與其他語言非常不同,也使使用Go語言編程不同於其他程式設計語言。你可能不喜歡上面的幾點。但是,如果沒有以上的幾點特性,你不可能編寫你的程式。你只需要做的是多寫2-3行。好處是,它會使你的代碼更加清晰。

代碼的可讀性VS效率

上述圖顯示的是Go幾乎與C / C ++一樣高效,同時代碼文法像Ruby,Python和其他語言一樣簡單,這是對人類和處理器的雙贏!

不同於其他的類似Swift的新語言,Go文法是非常穩定的。它的文法從最初的2012年公開發行1.0之後一直未變,這使它支援向後相容。

Go是Google支援的

· 我知道這是不是一個直接的技術優勢。但是,很重要的一點是,Go是Google設計並支援的。Google擁有世界上最大的雲基礎設施之一,並且它的規模不斷擴大。Go是由Google設計來解決他們的支援可擴充性和有效性問題。在建立自己的伺服器,你將面臨同樣的問題。

· 更多的大公司,比如Adobe,BBC,IBM,Intel甚至是Medium都在使用Go。(來源:https://github.com/golang/go/wiki/GoUsers)

結論:

· 即使Go不用於其他物件導向的語言,它仍然不可忽略。Go提供了像C / C ++一樣的效能,像Java一樣的超高效的並發處理,像Python / Perl一樣有趣的代碼。

· 如果你沒有任何計划去學習Go,我依舊認為硬體限制給了我們壓力,從而軟體開發人員可以編寫出超級高效的代碼。開發人員需要瞭解硬體,並對他們程式進行相應的最佳化。最佳化後的軟體可以運行在更便宜和更慢的硬體上(如運行IOT裝置)和終端使用者的體驗將得到更大的影響。

如若有錯誤之處,請指正~

相关数据包

oppo怎么取消锁屏

oppo怎么取消锁屏

📅 07-07 🔗 best365从哪能进去
英特尔固态硬盘有哪些型号,哪个型号好?
dnf金币交易哪个平台好?dnf金币交易网站平台推荐(限免手续费/金融级安全保障)
尿检阳性是什么意思

尿检阳性是什么意思

📅 07-08 🔗 best365从哪能进去
← 吉利星愿这款车怎样加装日行灯吗?有知道的吗? 白天睡不醒晚上睡不着的幽默句子(汇总91句) →