Go 語言這一年

作者 | 白明   責編 | 張文

來源 | 本文轉載自 TonyBai

題圖 | 自視覺中國

2020,這一六十年一遇的庚子年的確“名不虛傳”。

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

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

這恰說明 Go 語言的開發與推廣工作得到了更多來自全球的開發者的認可。

在這篇文章中,我們就來做一下 2020 年 Go 語言的盤點,看看在 2020 年圍繞 Go 語言、Go 社區和 Go 生態圈都發生了哪些有影響和有意義的事情。

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

但真正的全球大流行則大致始於 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 新冠大流行年中的穩步演進確定了節奏,指明瞭方向,奠定了基礎。


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[8]在線上舉行!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 工具鏈時代!

  • 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 作爲默認語言服務器。

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

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

  • 2020 年以後是 Go 語言的天下嗎?

  • 2020 年各個大廠內部 Go 語言開發環境是怎樣的呢?有什麼可以分享的經驗嗎?

  • Go 語言前景如何?

  • 2021 年後哪個後端編程語言會越來越流行?

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

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

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

對比上面的 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.6 到Go 1.9 版本的發佈後,業界對 Go 的期望達到了峯值;

  • 從 Go 1.10 開始,Go 似乎變得“仿徨”起來,原本期望 Go“一統天下”的願望沒能實現,全面出擊失敗後,期望的落空導致了人們對Go 產生了“功能孱弱劣勢”的印象,於是 Go 在 Go 1.11 發佈前跌到了“泡沫破裂”的谷底;

  • Go 1.11 引入了Go module,給社區解決Go 包依賴問題打了一劑強心劑,於是 Go 又開始了緩慢的爬升;

  • 從 TIOBE 提供的曲線來看,Go 1.12到Go 1.15 版本的發佈讓我們有信心認爲 Go 已經進入了“穩步爬升的光明期”。

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

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

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

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

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

  • 針對 x86-64 的新的基於寄存器的調用約定(不破壞現有程序集!),這將使程序與主流語言的 ABI 模型保持一致,並且整體更快;

  • 加入 build 指示器新語法://go:build;

  • 一個十多年前的 issue被 Go 團隊 accept:使用(*[4]int)(x)語法將切片 x 轉型爲一個數組類型指針(*[4]int)。

當然 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 將繼續穩步爬升,也許爬的並沒有那麼快,但在我看來,這是在積蓄力量,等待着下一個引爆點。

小結

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

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

更多精彩推薦
☞三種方法,用Python輕鬆提取PDF中的全部圖片
☞科學“乾飯”,AI 營養師教你

☞GitHub 標星超 26600,TiDB 社區運營的道與術!
☞告別手敲 SQL ?GPT-3 自動幫你寫


點分享點收藏點點贊點在看
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章