觀點 · 資訊分享

Go 1.27 釋出:終於支援泛型方法,encoding/json 底層換成 v2,goroutine 洩漏偵測轉正式

Go 1.27 在 8 月 19 日釋出。語言新增泛型方法,encoding/json 改由 v2 實作支撐、解碼明顯變快,goroutine 洩漏偵測轉為正式功能,也新增 uuid 與後量子簽章套件。

發布
2026-08-19
篇幅
約 4 分鐘 · 1,790 字
結構
9 節 + 3 題常見問題
標籤
#Go#Go 1.27#泛型#encoding/json#後量子密碼
Go 1.27 釋出:終於支援泛型方法,encoding/json 底層換成 v2,goroutine 洩漏偵測轉正式

一句話看懂:Go 1.27 釋出,語言終於支援「泛型方法」,encoding/json 底層換成 v2 實作,goroutine 洩漏偵測也轉為正式功能;官方說相容性承諾不變,但有幾個升級要注意的地方。

Go 1.27 新增泛型方法資訊圖卡:新增泛型方法,JSON 底層換 v2,goroutine 洩漏偵測轉正式

先用白話講:Go 是什麼?為什麼每半年看一次?

Go 是 Google 設計的程式語言,後端服務、雲端工具、命令列程式很常用它。它大約每半年釋出一個新版本,像是「每年兩次的大保養」:不會把舊程式搞壞,但會加新功能、修效能。

發生什麼事

Go 團隊在 8 月 19 日釋出 Go 1.27,距 Go 1.26 約半年。官方說明這次維持 Go 1 的相容性承諾,預期幾乎所有程式照樣編譯與執行;改動大多在工具鏈、執行階段與標準庫。下面挑最值得注意的幾項。

語言:終於有「泛型方法」

泛型就是「寫一次,適用多種型別」。以前 Go 的方法不能自己宣告型別參數,想要通用功能,只能寫成整個套件層級的函式。Go 1.27 讓方法本身可以帶型別參數,通用功能就能直接掛在資料型別上。官方的例子是 math/rand/v2 的 (*Rand).N。

限制是:介面的方法不能宣告型別參數,介面方法也不能由泛型方法實作。

// 示意:Go 1.27 起,方法可以宣告自己的型別參數
type Store struct{ data map[string]any }

func (s *Store) Get[T any](key string) (T, bool) {
	v, ok := s.data[key].(T)
	return v, ok
}

另外兩項小改動:結構字面值的鍵可以是任何有效的欄位選擇器;函式型別推論也擴大到更多情境。

標準庫:JSON 與新套件

  • encoding/json 改由 v2 實作支撐:行為保留,但錯誤訊息文字可能不同;官方說明解碼明顯變快、編碼大致持平。遇到相容問題,可在建置時設 GOEXPERIMENT=nojsonv2 退回舊版(預期未來移除)
  • 新增 encoding/json/v2:預設更嚴格,會拒絕無效的 UTF-8 與物件中的重複欄位名稱
  • crypto/mldsa:後量子簽章 ML-DSA(FIPS 204),crypto/tls 也支援 TLS 1.3 的 ML-DSA 簽章
  • uuid:新增 UUID 產生與解析套件
  • simd:實驗性的跨平台 SIMD 支援,需設 GOEXPERIMENT=simd

執行階段與工具

範圍 變化
goroutine 洩漏偵測 goroutineleak profile 從實驗轉為正式,也有 /debug/pprof/goroutineleak 端點
記憶體配置 小於 80 位元組的配置部分最高加速 30%,真實程式預期約提升 1%,執行檔增加約 60 KB
go test 預設執行 stdversion 檢查,找出用了比 go.mod 版本更新的標準庫功能
go mod tidy go 1.27 以上的模組,會把重複的 require 區塊合併成最多兩個
go doc 支援 package@version 寫法

升級前要注意

  • macOS:需要 macOS 13 Ventura 以上
  • bzr:go 指令不再支援 bzr 版本控制系統
  • GODEBUG:asynctimerchan 設定永久移除,time 套件的 channel 一律是無緩衝(同步)
  • gofmt:修正了跨 CPU 架構的對齊判斷,舊程式碼用新版 gofmt 可能出現少量空白變動
  • HTTP/1:Response.Body 關閉時會自動排空未讀內容,通常有助於連線重用;若程式原本就設定了不當的連線池,可能看到效能變化

我的看法

我自己更在意的是「升級不要出事」。這次最需要檢查的是 JSON:許多專案的單元測試會比對錯誤訊息字串,換成 v2 實作後文字可能不同,測試就會紅燈。升級前,我會先在 CI 跑一輪,再決定要不要設 nojsonv2 過渡。

泛型方法則是讓程式碼更好寫的長期改善,但不必急著大改既有程式。goroutine 洩漏偵測我會很快試:長時間運行的服務最怕的就是慢慢變大的記憶體,這個 profile 剛好能補一塊。要提醒的是,官方也說它無法偵測所有情況,不是萬靈丹。

名詞小辭典

  • 泛型(Generics):寫一次程式,就能處理多種資料型別。
  • goroutine:Go 的輕量級執行單位,一個程式可以同時開很多個。
  • 後量子密碼(Post-Quantum):能抵抗未來量子電腦攻擊的加密與簽章演算法。
  • SIMD:一個指令同時處理多筆資料,常用來加速運算。

資料來源

常見問題

泛型方法是什麼?有什麼用?
以前 Go 的方法不能自己宣告型別參數,想寫「適用多種型別」的通用功能,只能寫成整個套件層級的函式,或為每種型別各寫一個方法。Go 1.27 讓方法本身可以帶型別參數,通用功能就能直接掛在資料型別上,用起來更自然。
升級到 1.27,我的 JSON 程式會壞嗎?
官方說明 encoding/json 的編碼與解碼行為保留,但錯誤訊息的文字可能不同,所以若你的測試比對了完整的錯誤字串,可能要調整。遇到相容性問題,可以用 GOEXPERIMENT=nojsonv2 在建置時退回舊實作,這個選項預期未來會移除。
goroutine 洩漏是什麼?
goroutine 是 Go 的輕量執行緒。如果某個 goroutine 卡在一個永遠不會被解開的等待上(例如等一個沒人會寫入的 channel),它就永遠不會結束,佔用記憶體,這就是洩漏。新的 goroutineleak profile 能協助找出這類問題,但官方也說無法偵測所有情況。
LINE