Go1.24帶來泛型類型別名、弱指標,並改進了終結器

作者 | Sergio De Simone
譯者 | 平川
策劃 | Tina
Go 語言在最新版本 1.24 中引入了幾個重要的特性,包括泛型類型別名、弱指標,並改進了終結器等。它還增強了 map 預設實現、小物件分配以及互斥鎖處理的執行時效能。
Go 語言的類型別名為現有型別提供了一個同義詞,這非常有助於提高可讀性和簡潔性。現在,Go 1.24 允許為泛型型別建立類型別名。也就是說,類型別名可以指定一個型別引數。
type ComparableVector[T comparable] = Vector[T]type ComparableVectorOfInts = ComparableVector[int]type ThisWouldBeAnError = ComparableVector[[]int]
這裡有必要回顧一下,Go 提供了一種類似的語法,用於在現有型別的基礎上定義新型別,例如 type NewInt int。儘管語法的差別只是少了=,但由於 NewInt 不能代替 int,所以影響還是很大的。
有趣的是,對於是否引入泛型類型別名及其對語言的影響,有關討論已經持續了三年多。
弱指標不會增加物件的引用計數。當一個物件只被弱指標引用時,垃圾回收器就可以釋放它。因此,在嘗試使用弱指標的值之前,應檢查它是否為 nil
var strongInt int = 5var weakInt *intweakInt = &strongInt...weakInt.Value()
在實現物件快取等功能時,弱指標可能很有用,因為它可以避免物件僅僅因為包含在快取中而被保留下來。
Go 終結器的作用是在物件被垃圾回收時進行清理。在 Go 1.24 之前,這項工作可以使用 [runtime.SetFinalizer](https://tip.golang.org/pkg/runtime#SetFinalizer)來完成,但有幾個需要注意的事項,包括:無法在同一個物件上定義多個終結器;終結器對涉及引用迴圈的物件不起作用,等等。為了克服這些限制,Go 1.24 提供了一個新的執行時函式 AddCleanup,用於為物件註冊清理函式:
runtime.AddCleanup(objPointer, cleanupFunc, resourceToCleanUp)...funccleanupFunc(resourceToCleanUp CleanUpArgType) { ...}
該清理機制解決了上述終結器問題。此外,它還能確保所有的清理函式都在單獨的 goroutine 中順序呼叫。
如前所述,Go 1.24 改進了 map 的執行時效能。特別是,它採用 SwissTable 作為實現 map的基礎,並使用併發 hash-trie 來實現 sync.Map
使用 SwissTable,大型 map 的訪問和分配速度提高了 30%,預設大小 map 的分配速度提高了 35%,迭代速度提高了 10% 到 60%,具體取決於 map 中資料項的多少和大小。
同樣,採用併發 hash-trie 後,在幾乎所有基準測試中,新的 sync.Map 實現都擊敗了舊實現。
Go 1.24 包含的改進和更改遠不止這些,其中還包括:位元組包和字串包中新增的函式、ommitzero json 標籤、目錄受限的檔案系統訪問等。雖然釋出說明一如既往地簡潔,但你可以觀看 Reddit 使用者 GreenTowel3732 釋出在 YouTube 上的精彩影片概述。
原文連結:
https://www.infoq.com/news/2025/02/go-1-24-generic-aliases/
宣告:本文為 InfoQ 翻譯,未經許可禁止轉載。
今日好文推薦
Curl 之父:我是如何枕著18萬行C程式碼還能安穩入睡的
剛剛,DeepSeek 突然公佈成本利潤率高達545%!做 AI Infra 的該慌了?!
“前端已死”是危言聳聽嗎?
英偉達“賺錢機器”更強了!盈利創紀錄,黃仁勳:DeepSeek 為 GPU 降本,但下一代模型還離不開我

相關文章