Go 1 及 Go 程式未來的發展
引言
Go 語言版本 1(簡稱 Go 1)的釋出是 Go 語言發展史上的一個重要里程碑。Go 1 是一個穩定的平臺,為 Go 編寫的程式和專案的增長提供了基礎。
Go 1 定義了兩件事:首先是語言的規範;其次是一組核心 API(Go 標準庫的“標準包”)的規範。Go 1 版本包含了它們的實現,形式為兩個編譯器套件(gc 和 gccgo)以及核心庫本身。
我們期望按照 Go 1 規範編寫的程式,在該規範的整個生命週期內,無需修改即可繼續正確編譯和執行。在某個不確定的時間點,可能會出現 Go 2 規範,但在那之前,即使將來 Go 1 出現“點”版本(Go 1.1、Go 1.2 等),現在能工作的 Go 程式應該繼續工作。
相容性體現在原始碼層面。編譯後的包在不同版本之間不保證二進位制相容性。釋出點版本後,Go 原始碼需要重新編譯以連結新的版本。
API 可能會增長,增加新的包和功能,但不會以破壞現有 Go 1 程式碼的方式進行。
預期
儘管我們預期絕大多數程式會隨時間保持這種相容性,但無法保證未來沒有任何更改會破壞任何程式。本文件旨在闡明未來 Go 1 軟體的相容性預期。現在能夠編譯和執行的程式,在未來的點版本釋出後,有多種方式可能會失敗。它們都不太可能發生,但值得記錄。
- 安全性。規範或實現中可能會出現需要打破相容性來解決的安全問題。我們保留解決此類安全問題的權利。
- 未指定行為。Go 規範試圖明確語言的大多數屬性,但有些方面是未定義的。依賴於此類未指定行為的程式在未來版本中可能會中斷。
- 規範錯誤。如果需要解決規範中的不一致或不完整之處,解決該問題可能會影響現有程式的含義或合法性。我們保留解決此類問題的權利,包括更新實現。除非是安全問題,否則不會對規範進行不相容的更改。
- Bug。如果編譯器或庫存在違反規範的 bug,依賴於該 bug 行為的程式在 bug 修復後可能會中斷。我們保留修復此類 bug 的權利。
- 結構體字面量。為了在後續點版本中新增功能,可能需要在 API 中嚮導出的結構體新增欄位。使用未帶鍵的結構體字面量(如 pkg.T{3, "x"})建立這些型別值的程式碼在此類更改後將無法編譯。但是,使用帶鍵的字面量(pkg.T{A: 3, B: "x"})的程式碼在此類更改後將繼續編譯。我們將以一種允許帶鍵的結構體字面量保持相容性的方式更新此類資料結構,儘管未帶鍵的字面量可能無法編譯。(還有涉及巢狀資料結構或介面的更復雜情況,但它們的解決方案是相同的。)因此,我們建議型別在單獨包中定義的複合字面量應使用帶鍵的表示法。
- 方法。與結構體欄位一樣,可能需要在非介面型別中新增方法。在某些情況下,例如當型別與另一種型別一起嵌入到結構體中時,新方法的新增可能會透過與另一種嵌入型別的現有方法產生衝突而破壞結構體。我們無法預防這種罕見情況,也不保證發生這種情況時的相容性。
- 點匯入。如果程式使用
import . "path"
匯入標準包,未來版本中匯入包中定義的其他名稱可能與程式中定義的其他名稱衝突。我們不建議在測試之外使用import .
,使用它可能導致程式在未來版本中無法編譯。 - 使用
unsafe
包。匯入unsafe
的包可能依賴於 Go 實現的內部屬性。我們保留更改實現以可能破壞此類程式的權利。
當然,對於所有這些可能性,如果它們發生,我們都會盡可能努力更新規範、編譯器或庫,而不影響現有程式碼。
這些相同的考慮因素適用於後續的點版本。例如,在 Go 1.2 下執行的程式碼應該與 Go 1.2.1、Go 1.3、Go 1.4 等相容,但未必與 Go 1.1 相容,因為它可能使用了僅在 Go 1.2 中新增的功能。
在版本之間新增的功能(可在原始碼庫中找到,但不屬於帶編號的二進位制版本)正在積極開發中。在使用此類功能之前,對其相容性不作承諾。
最後,雖然這不是一個正確性問題,但程式的效能可能會受到其所依賴的編譯器或庫實現更改的影響。在不同版本之間,無法保證給定程式的效能。
儘管這些預期適用於 Go 1 本身,但我們希望基於 Go 1 開發的外部軟體也能考慮到類似的因素。
子倉庫
主 Go 倉庫的子倉庫(例如 golang.org/x/net)中的程式碼可能在更寬鬆的相容性要求下開發。但是,子倉庫將進行適當的標記,以標識與 Go 1 點版本相容的版本。
作業系統
無法保證與作業系統介面的長期相容性,因為作業系統介面會由外部方更改。syscall
包因此不在本文所作保證的範圍內。自 Go 1.4 版本起,syscall
包已被凍結。系統呼叫介面的任何演變都必須在其他地方支援,例如在 go.sys 子倉庫中。有關詳細資訊和背景,請參閱本文件。
工具
最後,Go 工具鏈(編譯器、連結器、構建工具等)正在積極開發中,其行為可能會改變。這意味著,例如,依賴於工具位置和屬性的指令碼可能會因點版本釋出而中斷。
撇開這些注意事項不談,我們相信 Go 1 將成為 Go 及其生態系統發展的堅實基礎。