Go 1.27 發布:方法可攜帶自己的型別參數,goroutine 洩漏偵測轉為正式功能
Go 官方發布說明 (go.dev/doc/go1.27) · 2026-08-19
核心改動
泛型方法是本次語言層面最大的變動:方法宣告現在可以擁有自己的型別參數,不再需要把泛型函式提升到套件層級才能使用。官方文件以 math/rand/v2 為例:
func (r *Rand) N[Int intType](n Int) Int限制是介面方法仍不能宣告型別參數,也不能由泛型方法實作介面方法。標準庫同時新增兩個套件:encoding/json/v2 提供 Marshal、MarshalWrite、MarshalEncode、Unmarshal、UnmarshalRead、UnmarshalDecode,全部接受可變長度的 Options 參數,預設行為比 v1 更嚴格:拒絕 JSON 字串中的非法 UTF-8,也拒絕物件內重複鍵名;配套的 encoding/json/jsontext 則提供底層的 token 與 state machine 處理。原本的 encoding/json 已改由 v2 實作支撐,v1 行為維持不變,僅錯誤訊息文字可能不同。此外新增獨立的 uuid 套件,用於產生與解析 UUID。
效能與診斷
編譯器現在會產生尺寸特化的記憶體配置呼叫,將小於 80 bytes 的配置成本降低最多 30%,實際 allocation-heavy 程式整體約可提升 1%,代價是二進位檔案體積增加約 60 KB。可用 GOEXPERIMENT=nosizespecializedmalloc 在建置時關閉,該旗標預計在 Go 1.28 移除。runtime/pprof 的 goroutineleak profile 從 Go 1.26 的實驗性功能轉為正式可用:偵測邏輯建立在垃圾回收的可達性分析上——若某個並行原語(channel、sync.Mutex、sync.Cond 等)從所有可執行 goroutine 都無法到達,卡在其上的 goroutine 就被判定為洩漏。限制是透過全域變數或可執行 goroutine 的區域變數間接可達的原語可能無法被偵測到。
影響範圍
- 泛型方法:僅一般型別可用,介面方法不受影響
encoding/json/v2:預設拒絕非法 UTF-8 與重複鍵名,v1 API 保留- 新增
uuid標準庫套件 goroutineleakprofile 由實驗性轉為正式 GA- 小物件配置最多加速 30%,二進位增加約 60 KB,可用
GOEXPERIMENT關閉
Rust 開放 nightly 實驗:用 splat 屬性讓 FFI 呼叫看起來像原生重載函式
Rust Inside Rust Blog · 2026-08-19
背景
Rust 專案在官方部落格發起呼籲,邀請社群在 nightly 編譯器上試用一項函式重載實驗,目標是改善與 C++ 等語言互操作時的呼叫語法。目前呼叫需要把多個參數包成 tuple,例如 hypot((2.0, 3.0, 6.0));新機制讓呼叫端可以寫成 hypot(2.0, 3.0, 6.0),仍由 trait 系統在背後做型別解析。此實驗自 2026-07-31 起提供於 nightly 版本,目標對象是編譯器與 interop 工具開發者。
技術細節
實驗由 #![feature(splat)] 功能旗標與 #[rustc_splat]屬性控制,追蹤議題為 rust-lang/rust#153629,建立於 2026 年 3 月 9 日,目前狀態標記為「尚無 RFC、實作未完成」。設計上先只支援 tuple 的展開(splatting),再逐步驗證程式碼生成最佳化是否合理,最後才會整理成正式 RFC。FFI 場景下的重載解析會利用既有的 Tuple trait,並搭配 Crubit 或巨集工具產生對應綁定;相關巨集實作放在 rustfoundation/overloading-macros,由 Outreachy 實習生 Ajay Singh 開發。跨語言重載的一致性(coherence)限制目前仍是未解決的開放問題。
參與方式
有興趣的開發者可透過 Project Goal 頁面了解實驗全貌,或在 t-lang/interop Zulip 頻道回報使用情況。官方強調該功能仍不完整、隨時可能變動或移除,目前僅建議編譯器與 interop 工具作者參與試用,不建議在一般專案中依賴。