醒醒吧,未來不會有 Go2 了!

語言: CN / TW / HK

大家好,我是煎魚。

馬上春節了,節前最後一更。提前預祝大家春節快樂!

本週末在學習的時候,看到 Go 團隊大當家 Russ Cox(下稱:rsc)在近期分享的《GopherCon 2022: Russ Cox - Compatibility: How Go Programs Keep Working》,講的是 Go 在相容性方面的現有問題和思考,還埋了個新預期。

如下圖:

他提出了一個新的 Slogan:“Go is boring, and that's good.(Go 很無聊,這很好)”,原因在於 Go 無聊是好的,因為無聊代表穩定的。無聊意味著你能夠專注於你的工作,而不是我們的工作。

核心來講,Go 團隊希望 Go 足夠簡潔,Gopher 不要整天卷 Go 的各種奇思妙計,要把精力都關注到自己的工作上,不要關注他們。

我一開始聽起來多少有點道理和自己的想法,聽著聽著這個車就剎不住了。

在最後的最後,rsc 冷不丁的正式官宣:不會有 Go2 了,會一直保持 Go1,將會加倍投入對 Go1 相容性的建設,這將非常有價值

如下圖:

當然,他也講了,狹義裡的 Go2 可能已經發生了,只是慢慢轉為了 Go1 的新特性融入到了 Go 之中。

最重要的,那些沒法相容的 “新” 東西怎麼辦?大方向的大招已經在前文《加大力度!Go 將會增強 Go1 向後相容性》有介紹過。

核心之一:使用 Go 工程中的 go.mod 檔案內的 go 版本號來控制編譯的選擇,決定各個庫在不同 Go 版本下以不同的表現來應用其特性,將會影響編譯時的決定。

如下圖:

  • 主模組(main module):宣告 go 版本是 1.19,他可以使用泛型和帶下劃線的數字。
  • 模組 A v1.0.0:宣告 go 版本是 1.17,模組 A 裡的包不可以使用泛型(1.18 才開始支援),帶下劃線的數字可以正常使用。
  • 模組 B v1.2.1:宣告 go 版本是 1.12,兩者都不能用。

在上述說明中,主模組、模組 A、模組 B,分別根據 go.mod 內的 go 版本號,應用到了不同的可用特性(有的可以用泛型,有的不可以用帶下劃線的數字,有的都不能用等)。

這本質是結合 Go modules 原本的依賴管理邏輯,再複用 go.mod 的 go 版本號給不同版本的不同特性來做好編譯的控制邏輯。

未來將不會有 Go2,都會是 Go1.x。

已經找到能往裡各種塞的姿勢了。

文章持續更新,可以微信搜【腦子進煎魚了】閱讀,本文 GitHub github.com/eddycjy/blog 已收錄,學習 Go 語言可以看 Go 學習地圖和路線,歡迎 Star 催更。

Go 圖書系列

推薦閱讀