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 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 及其生態系統發展的堅實基礎。