為什麼說 2017 年你必須要學習 Go 了

2021-01-08 開源中國
為什麼要學習Go

Go是未來的服務端語言— Tobias Lütke, Shopify。在過去的幾年中,Golang逐步流行起來。 還有什麼能比一門新語言讓碼農們瘋狂呢? 因此,我開始學習了一段時間Golang,在這裡我將告訴你為什麼你也應該學習這種新語言。 在本文裡我不會告訴你怎麼寫hello world。 我要分析計算機硬體軟體的當前階段,以解釋為什麼我們需要像Go這樣的新語言?

硬體限制

摩爾定律正在失效 第一個具有3.0GHz時鐘速度的Pentium 4處理器是由英特爾於2004年推出的。 而今天,我的Mackbook Pro 2016的CPU時鐘速度為2.9GHz。 可以看到在過去的十年中,CPU處理能力沒有太大的進步。 您可以在下面的圖表中看到這一點。


從上面的圖表可以看出,單線程的性能和處理器的頻率在過去的十年內保持平穩。如果你認為添加更多的電晶體是解決方案,那麼你錯了。這是因為在較小的尺度上一些量子性質開始出現(如隧道,因為它實際上用掉更多的更多的電晶體(為什麼?)並且添加電晶體的性價比在下降。 所以製造商開始向處理器添加越來越多的核心。現在我們有四核和八核CPU可用。 同時我們還引入了超線程。還向處理器添加更多緩存以提高性能。 但上述解決方案也有其局限性。我們不能向處理器添加更多的緩存以提高性能,因為緩存具有物理限制:緩存越大,緩存越慢。向處理器添加更多核心也具有成本。此外,這都不能無限擴展。這些多核處理器可以同時運行多個線程,並在紙面上帶來並發性。我們稍後將討論這一問題。 所以,如果我們不能完全依靠硬體的改進來提升性能,更高效的軟體也是我們需要考慮的手段。但遺憾的是,現代程式語言並不高效。

Go has goroutines!!

如上所述,硬體製造商正在向處理器添加越來越多的核心以提高性能。使用這些處理器的所有數據中心,在未來幾年內核數量將會大大增加。更重要的是,今天的應用程式使用多個微服務來維護資料庫連接,消息隊列和緩存。因此,我們開發的軟體和程式語言應該輕鬆支持並發性,並且它們應該隨著核心數量的增加而輕鬆擴展。 但是,大多數現代程式語言(如Java,Python等)發明於90年代的單線程環境。當然這並不意味著他們不支持多線程(譯者的話Python確實不支持多線程)。大多數程式語言支持多線程。真正的問題來自並發執行和線程鎖,競爭條件和死鎖。這些東西使得在這些語言上創建多線程應用程式很困難。 例如,在Java中創建新線程會消耗大約1MB的內存堆大小。最終如果你創建了數千個線程,這將對堆內存造成巨大的壓力,並將由於內存不足而被作業系統殺死。此外,如果你想在兩個或多個線程之間進行通信,也比較困難。 另一方面,Go在2009年發布時,多核處理器已經流行起來。這就是為什麼GoLang以並發為第一要務。 Go使用goroutines而不是線程。新建goroutine只使用近2KB的內存,你可以創建數百萬goroutine。


當然還有其他的好處:

具有可增長的分段堆。這意味著他們只在需要時才使用更多的內存。

Goroutines的啟動時間比線程快。

Goroutines帶有內置的原語,以便在它們之間(channel)安全地通信。

Goroutines允許您避免在共享數據結構時使用互斥鎖。

此外,goroutines和OS線程不是1:1映射。 單個goroutine可以在多個線程上運行。 Goroutine被復用到少量的OS線程中。

以上幾點,使Go非常強大,可以在處理並發(如Java、C和C++)的同時保持代碼的優雅(像Earlang)。


Go直接運行在硬體上

使用C、C ++的一個最大的好處是它們的性能比其他現代高級語言(如Java / Python)更強。 因為C / C ++是編譯執行而不是解釋執行的。 當您使用Java或其他基於JVM的語言構建應用程式時,它將代碼編譯為字節碼,在執行時,JVM解釋字節碼並將其轉換為處理器可以理解的二進位代碼。 


而C、C 不在VM上執行,從執行周期中刪除一個步驟,並提高了性能。 他們直接將代碼編譯成二進位代碼。 


但是在C/C中釋放和分配內存太過痛苦。 即使大多數程式語言可以使用垃圾收集器或引用計數算法處理對象分配和刪除。 Go同時擁有上面提到的好處。 Go是像C/C++這樣的低級語言並且是編譯型語言。 這意味著它的性能幾乎更接近低級語言。 並且Go還使用垃圾回收來分配和釋放內存。 所以不需要malloc和free!!!

Go代碼容易維護

Go有著非常整潔和乾淨的語法。Go的設計者在創建語言時考慮到了這一點。 由於google有非常大的代碼庫,成千上萬的開發人員正在使用同一個代碼庫,代碼應該易於其他開發人員理解。這將使代碼易於維護和修改。 Go故意去掉了很多現代OOP語言具有的功能。

以上的差異使Go與其他語言非常不同。 當然你可能不喜歡上面的一些點。 但是,在沒有上述功能的情況下 你需要做的僅僅是多寫2-3行代碼。 然而這樣會使你的代碼更加簡潔易懂。


上圖顯示Go幾乎與C/C++一樣高效,同時保持代碼語法簡單,如同Ruby,Python。 這是一個對人類和機器來說雙贏的局面! 與其他新語言(像Swift)不同,Go的語法非常穩定。 自從2012年首次公開發布1.0版以來,它保持不變。這使得它向下兼容。

Go的背後是Google結論

稿源:Go中國

相關焦點

  • 「去學校」是go to school,「回家」為什麼卻是go home?
    「在英語學習的過程中存在著一些令人摸不著頭腦的現象,而且都是一些小細節。本期文章就來討論其中一個很小的細節。」當我們表達「去學校」的時候,我們會說go to school。但是當我們表達「回家」的時候,我們卻會說go home。這是為什麼呢?
  • 為什麼要學習連讀?
    我想大家在做聽力練習的時候常常遇到這樣一種情況,聽,聽不懂,但當你把錄音原文找出來以後,你發現原來沒聽懂的那些單詞你都是學過的。於是你很困惑,為什麼我都學過了還是聽不懂呢?其實除了自己聽得少的原因之外,還有連讀弱讀知識你沒有掌握。
  • 2020年,為什麼我強烈建議你學習Go語言!
    可以說是2020年必學的一門程式語言,為什麼是這樣?聽我細細給你道來!編程難度:Go的對標語言不是Python而是靜態語言,例如C和C++等這些運行效率超高的靜態程式語言。C語言和C++的好處是偏底層,運行效率超級高。
  • 外教老師總是會說「have a go」,是啥意思?難道是讓你走一下?
    當然,情況並不是絕對的,如果你現在正準備英語等級考試,那麼詞彙量的重要性將不言而喻了。我們學英語時,也是從最基礎的最簡單的詞彙開始,比如「go」,似乎人人都知道它是「走,去」的意思,但是「have a go」你知道是啥嗎?外教老師經常在課堂上對學生說這個詞組,難道是讓你走一下嗎?我們一起來學習。
  • 2017年瑞士制表你必須知道的巨大變革
    在馬上就要到來的2017年,一隻手錶想要印有「瑞士製造」的印記,要求將會變得更加嚴格。關於相關法律條文的修改經歷了將近20年,在這期間經過了反覆的討論、投票以及修正等一系列繁複程序。這一法律條文的變化將會對整個瑞士制表業帶來全新機遇同時也對全球制表業產生影響。
  • 如何使用動詞GO-How to Use the Verb GO: Go To, Go For, Go On
    學習如何在英語中使用動詞GO和例子。The following lists help you remember when to use go, go to, go to the, go to a, go forand go on.下面的列表幫助你記住什麼時候使用go, go to, go to, go to a, go for and go on。
  • 輝子2017新歌Baby Don't Go完整版歌詞介紹 Baby Don't Go好聽嗎
    輝子2017新歌Baby Don't Go完整版歌詞介紹 Baby Don't Go好聽嗎  Baby Don't Go - 輝子  詞:輝子  曲:輝子  編曲:YOUNGFLU  定位製作人:劉洲  錄音:歐恆  混音:李金城  母帶:李金城  出品:Door
  • 學習書法必須臨帖嗎?為什麼不能隨意揮灑?
    凡事沒有絕對,我是從來不講絕對的話的,我認為學習書法不一定臨帖,但是如果你真的想寫好書法,那麼,對不起,你還真就得臨帖,除了這條路之外,沒有別的方法了。有人問我,學習書法必須臨帖嗎?為什麼不能隨意揮灑?學習方法的過程,我們姑且可以理解為唐僧西天取經的歷程。
  • 老外常說的「there you go」是什麼意思呢?說出3種算你厲害!
    老外口中有一些經常說的詞彙,放在不同的語境裡面,所表現出來的意思完全不同,比如大白今天要說的「There you go」。了解的人一定都知道There you go可能是老外最常說的句子之一了,裡面包含的意思特別特別的多,但是你要是有外國朋友問他這是什麼意思,他可能一時也說不明白,大白簡單的整理了一下,希望能幫助大家理解其意思。
  • 老外說「You go too far」,可不是你走遠了,理解錯就尷尬了
    前段時間聽到一句英語叫「You go too far」,大部分的人都會以為這是說「你走遠了」,其實並不是。在英語中far是遙遠的意思,大部分的小夥伴聽到too far,都會覺得是「太遠」,那其實這裡所說的是「你太過分了」,例句:I didn't mind at first, but now you have gone too far剛開始我不介意,但是現在你做得有點過分了。
  • 為什麼荷蘭人討厭 go dutch
    又一次我們聊到「go Dutch(分開付款)」,我開玩笑的問她荷蘭人是不是比較在意AA制,出去吃個飯都要go Dutch?她說沒有啦,荷蘭人其實很討厭go Dutch這種表達,甚至有人會認為這種說法是在給荷蘭摸黑。
  • 雙語:Pokemon Go怕玩家不隔離,要變成Pokemon Stay
    新東方網>英語>英語學習>英語閱讀>雙語新聞>時政熱點>正文雙語:Pokemon Go怕玩家不隔離,要變成Pokemon Stay 2020-04-28 17:22 來源:滬江
  • 聽到老外對你說Go fly a kite,才不是讓你去放風箏,他是發火了
    例如:Why don't you just go fly a kite?你怎麼不滾遠一點?類似的說法還有好幾種:go climb a tree、go jump in a lake 和go soak your head,以上說法全都起源於20世紀初,但關於這個用語的真正起源無法確定。這些說法都是比較不禮貌的用法,表示你希望某人讓你一個人靜靜,雖然無禮但並不會粗俗。
  • 做健身教練為什麼要學習理論知識?
    事實上大家都會認為健身教練是技能型的職業,是一個偏向實踐的職業,但其實做一名合格的健身教練還是要學習理論知識的,我們現在就來說說做健身教練為什么學習理論知識。當你給會員制定學習計劃的時候,你要搞清楚自己要準備做什麼?練哪裡?要做一個什麼樣的動作才能達到你想要的運動效果?
  • 把「您先請」說成You go first,老外會覺得你超級沒禮貌!
    這類表達我們統稱叫做【Culture based mistake】文化性錯誤避免這類錯誤,只能靠日常不斷地積累和學習。今天所長就給大家說幾個常見的錯誤表達,看看你都「中槍」了沒~01您先請 ×如果說」You go first」,雖然意思是「你先走」,但這話卻很刺耳,因為這是一個命令式的表達。那該怎麼說才禮貌呢?老外說After you.跟在你後面。
  • 朋友說Go jump in the lake,可不是要你跳進湖裡遊泳,要冷靜!
    酷酷的你,記得點擊右上角關注我們吶!黃金周大假結束了,咔咔內心是千萬個不樂意。偏偏還有小夥伴來刺激我,說她還可以繼續休假,還可以繼續狂歡,繼續happy,咔咔的小暴脾氣蹭一下就起來了,說了一句「Go jump in a lake!」,小夥伴嚇得迅速隱匿了,哦耶!
  • 短語go to town的英語意思和口語訓練
    go to town[2]04:41來自英語老師覃冠平學英語時能夠不厭其煩、反覆的查閱字典,這本身就說明你具備了學習力,也說明你的英語學習已經在進步了。顯然我們要學習的是它的figurative meaning1) 我們把所有能查到的英英字典都查了一通:I got you.I know what Go to town means now:我們要做的第一步,就是你見到go to town,你能想到的是什麼英語,或者多少英語,而不是想到的是什麼中文意思。
  • 英語單詞go,千萬不要說它是走的意思
    英語中總有一些單詞,看起來非常簡單,你一查字典,就簡簡單單幾行字,看起來似乎很容易,但一到用的時候,你確發現,自己怎麼也用不上。這一方面說明我們基礎不牢沒有真正學會這些不起眼的單詞,另一方面,說明我們的教育以及學習,並沒有真正重視這些小詞。殊不知,人家母語人士,正是靠這些小詞出神入化的運用來解決平時的交流溝通,而我們只是學兩三個詞組,考也是那幾個詞組。
  • 你,為什麼要健身?
    你為什麼要健身?你可能覺得我又要餵你喝一碗雞湯,其實不是… 我只是想找個話題和你們聊聊天;如果運氣夠好,你喜歡或者你打算健身,那我們肯定有得聊,如果運氣不好,你對健身沒有興趣,你就當我是自言自語,自說自話!
  • go to pieces是物品被撕成碎片嗎?其實是身心崩潰的意思
    go to pieces發狂;身心崩潰。這裡的go to不是去哪裡的意思,而必須解釋為「變成,成為"。肯特:要不要跟我們一起去動物收容所做義工?範妮:我想不要了吧。肯特:為什麼?你一直很喜歡動物的。範妮:我怕他們讓動物安樂死的時候,我會受不了。肯特:我一開始也那麼覺得,不過你會學到很多。