Go 1 及 Go 程式的未來
簡介
推出 Go 版本 1(簡稱 Go 1)是該語言發展中的一個重要里程碑。Go 1 是使用 Go 編寫的程式和專案成長的穩定平台。
Go 1 定義了兩個項目:第一,語言的規格;第二,一組核心 API 的規格,也就是 Go 函式庫的「標準套件」。Go 1 版本包含了透過兩個編譯器套件 (gc 和 gccgo),以及核心函式庫本身來執行的程式。
預期根據 Go 1 規格編寫的程式會繼續在該規格的生命週期中,不變更地正確編譯和執行。在某個不確定的時間點,可能會出現 Go 2 規格,但在那之前,現今可以正常運作的 Go 程式,即使未來出現 Go 1 的「重點」版本(例如 Go 1.1、Go 1.2 等),也應該可以繼續運作。
相容性在原始程式碼層級。編譯套件的二進位相容性無法在各版本之間保證。在重點版本之後,Go 原始程式碼將需要重新編譯才能連結至新版本。
這些 API 可能會大量增加,取得新的套件和功能,但並不會破壞現有的 Go 1 程式碼。
預期
雖然我們預期絕大部分程式將會在之後保持此相容性,但無法保證未來的變更不會損壞任何程式。本文件是嘗試設定 Go 1 軟體在未來相容性的期望。有些程式今天編譯並執行後,可能因為未來重點版本而無法執行。它們都是不太可能發生,但值得記錄一下。
- 安全性。規範或實作中可能露出安全問題,而解決該問題必須破壞相容性。我們保留處理此類安全問題的權利。
- 未指定行為。Go 規範試圖明確語言的大部分屬性,但有些面向是未定義的。依賴此類未定義行為的程式可能在未來的發行版中損壞。
- 規範錯誤。如果需要處理規範中的不一致或不完整處,解決問題會影響現有程式的意義或合法性。我們保留處理此類問題的權利,包括更新實作。除了安全問題外,不會對規範進行任何不相容的變更。
- 錯誤。如果編譯器或函式庫有違反規範的錯誤,依賴錯誤行為的程式可能在錯誤修正後損壞。我們保留修正此類錯誤的權利。
- 結構體文字。為了在之後的重點版本中新增功能,可能必須將欄位新增至 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 及其生態系開發的堅實基礎。