
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 = 5
var weakInt *int
weakInt = &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 翻譯,未經許可禁止轉載。
