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 的比較,去讀前面連結的那篇。 ...

Golang 1.26 新特性在數量上史無前例的多

隨著時間來到 2026 年初,Go 語言迎來了 1.26 版本的更新。如果說 Go 1.18 的泛型是語言層面的重大變革,那麼 Go 1.26 則是在「數量」與「廣度」上讓人感到驚艷的一次釋出。從語言特性的語法糖、標準庫的實用擴充,到 Runtime 效能的顯著提升(Green Tea GC),甚至是實驗性的 SIMD 支援,這次的更新內容豐富到讓人目不暇給。 本文將挑選其中幾個我認為對日常開發最重要、或最有趣的改動來進行介紹。 語言層面的改動 new(expr):終於不用再寫輔助函數了 在 Go 1.26 之前,如果我們想要取得一個基本型別(如 int, bool, string)的 pointer,通常需要宣告一個變數或者寫一個輔助函數。這在定義 struct 的 literal 時特別煩人,尤其是當 struct 欄位是 *bool 或 *int 用來區分「零值」與「未設定」的時候。 回顧過去,我們為了這個小需求付出了不少努力: 在 Go 1.18 泛型出現之前:我們經常需要定義一堆如 Int64Ptr(v int64) *int64 或 Float64Ptr(v float64) *float64 的輔助函數(AWS SDK 的使用者應該對此非常熟悉)。 匿名函數大法:如果不想要定義全域的輔助函數,有時甚至會看到像 enabled := func(b bool) *bool { return &b }(true) 這種冗長且難讀的寫法。 泛型時代:雖然可以用一個通用的 ptr[T] 解決,但還是需要額外的程式碼。 以前我們可能需要這樣做: func ptr[T any](v T) *T { return &v } type Config struct { Enabled *bool } conf := Config{ Enabled: ptr(true), } 在 Go 1.26 中,內建的 new 函數得到了增強,現在它不僅接受型別,還可以直接接受表達式(Expression)。 ...