摘要: Go 1.27 於 8 月 19 日發布,加入可自帶型別參數的方法、encoding/json/v2 引擎,以及整合到 x509 與 TLS 1.3 的 ML-DSA 後量子簽章。JSON 預設行為轉嚴,會拒絕無效 UTF-8 與重複欄位名;文章建議會處理不受信任輸入的服務先在測試環境驗證。
Go 1.27 在 8 月 19 日發布,正好是 1.26 之後半年,Go 1 的相容性承諾照樣不變。這版裡有幾樣長年排在願望清單上的東西:方法可以自帶型別參數、JSON 層重新打造過,還有直接做進標準庫的後量子簽章。天天在寫 Go 的人會感覺到,這次的改動一頭落在怎麼寫,另一頭落在怎麼跑。
語言:泛型方法總算到位
方法在 Go 1.27 裡能宣告自己的型別參數。標準庫就藏著最直接的示範:math/rand/v2 的 N 方法,以往每個整數型別都得配一個方法,如今單一個泛型方法就涵蓋所有整數型別。介面方法仍舊不得宣告型別參數,這條界線沒有移動。另一個喊了很多年的訴求同樣成真:結構實字的鍵,現在只要是合法的欄位選擇器就接受,嵌入欄位因此能直接寫在實字裡完成初始化,不必一層一層往內疊。泛型函式的型別推斷範圍也擴大到所有指定場合,composite literal、型別轉換、channel 發送都算在內,型別引數可以省下來不寫。
標準庫:json v2 全面接手,後量子簽章挺進 TLS
標準庫這邊動得最大的,是 encoding/json/v2 正式推出,並搭配負責低階串流的 jsontext。真正關鍵的取捨在於:encoding/json 的既有 API 一個字都沒動,內部卻換上 v2 的實作,反序列化因此快了一截,預設也轉為從嚴——無效 UTF-8 與重複欄位名一律擋下,需要舊有寬鬆行為的程式,可以在遷移期間用 GOEXPERIMENT 選項切回去。安全性上,新加入的 crypto/mldsa 把 FIPS 204 的 ML-DSA 後量子簽章做了出來,並接上 crypto/x509 與 TLS 1.3。其餘的還有:標準 uuid 套件總算報到,實驗性質的 simd 套件則給出跨平台向量運算的抽象層,現階段涵蓋 arm64 Neon 與 wasm。
工具鏈、執行環境與平台要求
工具鏈的更新都指向日常維護。go fix 多了幾個 modernizer,負責把舊慣例自動改寫成新的;go doc 現在接受 package@version 查詢,想看哪個依賴版本的文件直接查就有了;go mod tidy 則把散成好幾個的 require 區塊收成標準的兩段式。執行環境上,80 位元組以下的物件配置開銷最多少了 30%,換算到整個程式大約是 1% 的進帳,代價是每支執行檔胖了 60KB。runtime/pprof 的 goroutineleak profile 從實驗走向正式,能自動找出永遠卡住的 goroutine——這類問題在 Go 開發裡向來最難追。平台門檻也動了:macOS 要 13 Ventura 以上。
升級時該留意什麼
大多數專案升級起來風險不高,因為語言層的每項改動都是鬆綁,動不到現有程式;真正會咬人的是 JSON 轉嚴的預設值——服務若會吃進不受信任的輸入,先在測試環境走一遍再上線。可以照這個次序走:升完級先讓 go fix 把機械性的現代化改寫跑過一遍,再回頭檢查依賴裡有沒有套件靠著 JSON 從前寬鬆的行為在運作,最後才評估 TLS 層要不要開 ML-DSA。後量子遷移是接下來幾年每個語言都得處理的題目;Go 選擇把它收進標準庫,而不是留給社群各自發展,整個生態因此少了一次密碼學套件各立山頭的過程。
