2020 年 Go 語言盤點:新冠大流行阻擋不了 Go 演進的步伐

bigwhite-github發表於2020-12-30

img{512x368}

2020,這一六十年一遇的庚子年的確 “名不虛傳”。在這一年發生了很多事,而最受矚目的事情莫過於新冠疫情的全球大流行。疫情給全球的經濟帶來了近似毀滅性的打擊,給人們的生命帶來了極大威脅,給人們的生活也帶來了很大痛苦及不確定性。好在這個糟糕的 2020 年馬上就要過去了!相信此時此刻每個人心中都會有一句吶喊:“2020,快滾吧!”。

然而肆虐的新冠疫情並沒有阻擋住 Go 語言前進的堅實步伐。在這艱難的一年中,在 Go 核心開發團隊和 Go 社群的齊心協力下,Go 同樣取得了不俗的成績,甚至在 2020 年 3 月 (那時Go 1.14 版本剛剛釋出不到一個月),Go 在TIOBE 的程式語言排行榜中還一度擠進前十(而 2019 年同期,Go 僅位列 18 位):

img{512x368}

這恰說明 Go 語言的開發與推廣工作得到了更多來自全球的開發者的認可。在這篇文章中,我們就來做一下 2020 年 Go 語言的盤點,看看在 2020 年圍繞 Go 語言、Go 社群和 Go 生態圈都發生了哪些有影響和有意義的事情。

1. 面對大流行,Go 核心團隊給出 “定心丸”

大流行始於 2020 年 1 月的武漢,但真正的全球大流行則大致始於 2020 年 3 月。面對新冠全球大流行,Go 核心開發團隊於 3 月 25 日作出反應,在官博發表文章《Go, the Go Community, and the Pandemic》,迅速調整了 Go 語言 2020 年的演進計劃,給出了大流行期間的工作原則:

  • Go 始終排在諸如個人和家庭健康與安全之類的基本問題之後;
  • 調整全年 Go 技術會議的計劃,推遲或改為線上舉辦虛擬技術大會,為全球 Gopher 提供獲取這些會議最新資訊的渠道服務;
  • 為線上培訓師、Go 職位釋出提供便利服務;
  • 為新冠病毒提供幫助工作臺https://covid-oss-help.org/
  • 調整 Go 工作計劃,縮減Go 1.15中包含的新特性和改進,但會遵循 Go 1.15 的釋出時間表;重點支援 gopls、pkg.go.dev 的演進和優化。

Go 核心開發團隊的這份宣告雖然簡短,但卻給 Go 社群吃了一顆 “定心丸”,為 Go 語言在 2020 新冠大流行年中的穩步演進確定了節奏,指明瞭方向,奠定了基礎。

2. Go 在 2020 年值得關注的那些變化

2020 一年,Go 核心開發團隊、社群和生態圈做了很多工作,但這裡無法一一列舉,僅挑出一些重要的變化列在這裡:

  • 2020年2月26日,Go 1.14 版本釋出。主要的變動點包括:

    • 嵌入介面的方法集可重疊;
    • 基於系統訊號機制實現了非同步搶佔式的 goroutine 排程;
    • defer 效能得以繼續優化,理論上有 30% 的效能提升;
    • go module 已經生產就緒,並支援 subversion 原始碼倉庫;
    • 重新實現了執行時的 timer;
    • testing 包的 T 和 B 型別都增加了自己的Cleanup方法。
  • 2020年4月20日,釋出2019 年 Go 開發者調查結果

    • 參與 2019 開發者調查的 gopher 數量幾乎為 2018 年的 2 倍,達到 10,975 人;
    • 大多數受訪者每天都在使用 Go,而且這個數字每年都有上升的趨勢;
    • Go 的使用仍然集中在科技公司,但 Go 越來越多地出現在更廣泛的行業中,如金融和媒體;
    • 調查的大部分指標的同比值都很穩定;
    • 受訪者正在使用 Go 來解決類似的問題,特別是構建 API/RPC 服務和 CLI,和他們工作的組織規模大小關係不大;
    • 大多數團隊試圖快速更新到最新的 Go 版本;當第三方供應商遲遲不支援當前的 Go 版本時,就會給開發者造成採用障礙;
    • 現在 Go 生態系統中幾乎所有人都在使用go module,但圍繞包管理的一些混亂仍然存在;
    • 需要改進的高優先順序領域包括除錯、go module 使用以及與雲服務互動的體驗改善;
    • VS Code 和 GoLand 的使用量持續增加;現在每 4 個受訪者中就有 3 個首選它們。
  • 2020 年 6 月,vscode-go 擴充套件 (vscode 上的 go 標準外掛) 將主程式碼庫從 github.com/microsoft/vscode-go 遷移到 github.com/golang/vscode-go,成為 Go 官方專案的一部分。

  • 同在 2020 年 6 月,pkg.go.dev 網站開源!該網站是 Go 團隊在 Go 社群建設方面做出的主要工作,開源後的 pkg.go.dev 將接收更多來自社群的想法和改進意見,比如:11 月,pkg.go.dev 就釋出了新版頁面設計原 godoc.org 的請求也被重定向到 pkg.go.dev(廣大 gopher 可能需要一段時間來適應這種改變)。

  • 2020 年 8 月,Go 1.15 版本釋出,其主要的變動點包括:

    • GOPROXY 新增以管道符為分隔符的代理列表值;
    • module cache 的儲存路徑可設定;
    • 改善派生自原生型別的自定義型別變數在 panic 時的輸出形式;
    • 將小整數 ([0,255]) 轉換為 interface 型別值時將不會額外分配記憶體;
    • 加入更現代化的連結器 (linker),新連結器的效能要提高 20%,記憶體佔用減少 30%;
    • 增加 tzdata 包。
  • 2020 年 11 月初,全球最具影響力的 Go 語言技術大會GopherCon 2020線上上舉行!Austin Clements 詳細講解了 Go 1.14 加入的基於系統訊號的搶佔式排程器;Go 語言之父之一的 Robert Griesemer 講解了Go 泛型當前的狀態以及未來的計劃。會後 Russ Cox 確認了 Go 團隊將在 Go 1.18 版本中加入 Go 泛型 (型別引數)作為試驗特性;

  • 2020年11月10日,Russ Cox 代表 Go 核心開發團隊發文慶祝Go 語言釋出 11 週年,在文中他回顧了 Go 這一年來的收穫以及對 2021 年Go 1.16和 Go 1.17 的展望。文中他還提到了 GOPATH 的歷史使命即將結束,Go 將開啟全面 module-aware 模式的 Go 工具鏈時代!(下圖來自推特):

img{512x368}

  • 2020 年 12 月中旬,Go 1.16beta1 釋出。在Go 1.16中,Go 將原生提供對 Apple M1 晶片 (darwin/arm64) 的支援;同時,在 Go 1.16 中 go module 將成為預設包依賴管理機制;Go 1.16 還提供了支援在 Go 二進位制檔案中嵌入靜態檔案的官方原生方案,支援對 init 函式的執行時間和記憶體消耗的跟蹤,連結器效能得到進一步優化等。

  • 2020年12月16日,gopls v0.6.0釋出。同期,vscode-go 也正計劃將 gopls 作為預設語言伺服器

3. Go 語言當前的狀態:已來到 “穩定爬升的光明期”

今年筆者在知乎上滯留的時間比往年要長一些,看到很多人問與 Go 相關的一些問題,大致都是詢問有關 Go 語言前景的,比如:

無論上述問題的題目有何不同,其本質的疑問都是 “Go 語言前景/錢景如何,值不值得投入去學習?”。那麼是否存在一種成熟的方法能相對客觀地描會出 Go 語言的發展態勢並能對未來 Go 的走勢做出指導呢?我想 Gartner 的技術成熟度曲線(The Hype Cycle)或許可以一試。

我們知道 Gartner 的技術成熟度曲線又叫技術迴圈曲線,是企業用來評估新科技是否要採用或採用時機的一種視覺化方法,它利用時間軸與該技術在市面上的可見度 (媒體曝光度) 決定要不要採用以及何時該種新科技,下面就是一條典型的技術成熟度曲線的形狀:

img{512x368}

同理,將該技術成熟度曲線應用於某種程式語言,比如 Go,我們就可以用它來判斷該程式語言所處的成熟階段以輔助決定要不要採用以及何時採用該門語言。我們從知名的TIOBE 程式語言指數排行榜獲取 Go 從 2009 年開源以來至今的指數曲線圖,並且根據Go 版本釋出史在圖中標記出了各個時段的 Go 釋出版本:

img{512x368}

對比上面的 Gartner 成熟度曲線,相信你肯定有所發現。我們共同來解釋一下:

  • Go 語言從 2009 年宣佈開源以來,經歷了兩次 “高峰”:一次是 2009 年剛剛宣佈開源後,一次是在 Go1.7~Go 1.9 期間。顯然,第一次的高峰實際上是一個 “假高峰”,那時的 Go 連 1.0 版本都尚未釋出,我們完全可以將其 “剔除” 掉。
  • 從圖中來看,Go 語言的技術萌芽期是比較長的,從 2012 年的 Go 1.0 一直持續到 2015 年的Go 1.5
  • Go 1.5 版本的自舉以及 Go 垃圾回收延遲的大幅下降 “引爆” 了 Go 的 “媒體曝光度”,Go 技術的 “期望膨脹期” 開始,經歷從Go 1.6Go 1.9 版本的釋出後,業界對 Go 的期望達到了峰值;
  • 從 Go 1.10 開始,Go 似乎變得 “仿徨” 起來,原本期望 Go“一統天下” 的願望沒能實現,全面出擊失敗後,期望的落空導致了人們對Go 產生了 “功能孱弱劣勢” 的印象,於是 Go 在 Go 1.11 釋出前跌到了 “泡沫破裂” 的谷底;
  • Go 1.11引入了Go module,給社群解決Go 包依賴問題打了一劑強心劑,於是 Go 又開始了緩慢的爬升;
  • 從 TIOBE 提供的曲線來看,Go 1.12Go 1.15 版本的釋出讓我們有信心認為 Go 已經進入了 “穩步爬升的光明期”。

到此,我相信知乎上的很多問題都應該迎刃而解了,剩下的只是如何學習 Go 的細節如何 Go 進階了。

不過可能還有很多朋友會問,Go 何時能達到實質生產高峰期呢?這個問題真不好回答。但進入了 “穩步爬升的光明期” 後的 Go 到達實質生產高峰期只是一個時間問題了,也許 2022 年初發布的支援 Go 泛型特性的 Go 1.18 版本會快速推動 Go 向更高階段進發!

4. 展望 Go 的 2021:繼續蓄力,迎接下一個 “引爆點”

促使 Go 回到 “穩步爬升光明期” 的 go module 機制將在 2021 年年初正式釋出的 Go 1.16 中成為預設包依賴管理機制。而Go 1.16 版本也已經處於特性凍結併發布了 beta1 版本的階段,其更多特性可以參考我的“Go 1.16 新功能特性不完全前瞻”一文。

將於 2021 年八月釋出的Go 1.17 的里程碑已經建立, 從里程碑的內容來看,已基本確定加入的功能特性和改進包括:

當然 Go 1.17 還會持續優化連結器,更多功能特性和改進還待 Go 團隊策劃補充。

而萬眾期待的 Go 泛型依然會繼續打磨,從 2016 年 Ian Lance Taylor 提出“Go should have generics”的設計草案以來,Go 泛型草案至今已經討論了 4 年多了,這再次證明了 Go 團隊對於這類會顯著增加 Go 複雜性的特性是多麼地 “慎之又慎”。雖然 Go 團隊初步確定了在 Go 1.18 版本中將 Go 泛型(型別引數)落地,但近期 Go 專案中關於 Go 泛型的主 issue:proposal: spec: generic programming facilities中仍然有不少反對的聲音。Go 團隊在“繼續保持 Go 簡單”的道路上真是任重道遠啊!

總之,2021 年,Go 將繼續穩步爬升,也許爬的並沒有那麼快,但在我看來,這是在積蓄力量,等待著下一個引爆點。

5. 小結

Go 在新冠疫情大流行的歷史時期依舊步行穩健,為下一個 “引爆點” 積極蓄力。Go 在自己傳統領域依舊存在明顯優勢,比如:企業級應用、基礎設施、中介軟體、微服務 API、命令列應用等,並且在這些領域取得了越來越多開發者的青睞。

Go 在其他領域也有 “意外收穫”,比如:在黑客工具領域,Go 已經逐漸威脅著 Python 的龍頭地位了,顯然語法簡單原生併發自帶 “電池”、輕鬆跨平臺的編譯以及編譯為獨立二進位制檔案的 Go 與黑客的需求十分契合。不過,在安全領域成為了進攻 “武器”,這想必是 Go 設計者們所意料不到的。

6. 福利!2020 年本部落格最受歡迎 Go 相關文章 TOP10


Gopher 部落知識星球已正式轉正了!高品質首發 Go 技術文章,“三天” 首發閱讀權,每年兩期 Go 語言發展現狀分析,每天提前 1 小時閱讀到新鮮的 Gopher 日報,網課、技術專欄、圖書內容前瞻,六小時內必答保證等滿足你關於 Go 語言生態的所有需求!星球首開,福利自然是少不了的!2020 年年底之前,8.8 折加入星球,下方圖片掃起來吧,先到先得哦!

Go 技術專欄 “改善 Go 語⾔程式設計質量的 50 個有效實踐” 正在慕課網火熱熱銷中!本專欄主要滿足廣大 gopher 關於 Go 語言進階的需求,圍繞如何寫出地道且高質量 Go 程式碼給出 50 條有效實踐建議,上線後收到一致好評!歡迎大家訂閱!

Gopher Daily(Gopher 每日新聞) 歸檔倉庫 - https://github.com/bigwhite/gopherdaily

我的聯絡方式:

更多原創文章乾貨分享,請關注公眾號
  • 2020 年 Go 語言盤點:新冠大流行阻擋不了 Go 演進的步伐
  • 加微信實戰群請加微信(註明:實戰群):gocnio

相關文章