Golang 1.27 新特性整理:泛型補完與轉正的實驗性功能
半年前寫完 Go 1.26 新特性 那篇,文末問了一句「準備好更新你的 go.mod 到 go 1.26 了嗎?」,沒想到一轉眼 Go 1.27 也要來了。撰文的當下 Go 1.27 即將正式發布,以下內容是根據 release candidate 整理,如果正式版有微調,還是以官方 release notes 為準。 如果說 Go 1.26 給我的感覺是數量多、廣度大,那 Go 1.27 更像是把之前欠的債還一還。generic method 從 issue 一路等到現在終於落地,goroutineleak profile 從需要 GOEXPERIMENT 才能開的實驗功能轉正成預設行為,encoding/json/v2 也從實驗畢業成為預設實作。這篇就挑幾個我覺得值得記錄的改動來聊聊。 語言層面:泛型設計的最後一塊拼圖 Generic Method 真的來了 這件事我在 Go 1.27 即將支援 Generic Method 那篇已經寫得很詳細了,這裡就不重複展開,只放結論:method 現在可以宣告自己的 type parameter,不用再繞道用 package-level function 把 receiver 當參數傳進去。 type List[T any] struct { items []T } func NewList[T any](items ...T) List[T] { return List[T]{items: items} } // MapTo 是 generic method,帶著自己的型別參數 U, // 跟 receiver 的型別參數 T 是兩回事。 func (l List[T]) MapTo[U any](f func(T) U) List[U] { out := make([]U, len(l.items)) for i, v := range l.items { out[i] = f(v) } return List[U]{items: out} } type Cat struct { Name string Age int } cats := NewList(Cat{"Mittens", 3}, Cat{"Tama", 5}) names := cats.MapTo(func(c Cat) string { return c.Name }) fmt.Println(names.items) // [Mittens Tama] 老話一句:interface 目前還是無法宣告帶 type parameter 的 method,這是 dynamic dispatch 架構性的限制,不是漏掉沒做。想看完整的來龍去脈跟 workaround 的比較,去讀前面連結的那篇。 ...