go 1.18 中引入了泛型,可創建獨立于類型的代碼。泛型使用方括號 [] 定義類型參數,如 func sort[t any](arr []t)。go 編譯器可以推斷類型參數,如 func swap[t](x, y t)。泛型可用于構建數據結構,如二叉查找樹 type node[t any] struct { … },并施加類型約束,如 type node[t comparable] struct { … }。go 泛型提高了代碼的靈活性,而不產生新的類型。
Go 泛型的定義和應用
在 Go 1.18 中,Go 語言引入了備受期待的功能:泛型。泛型允許您創建獨立于具體類型的數據結構和算法,從而提高代碼的可重用性和靈活性。
定義泛型
泛型使用方括號 []
來定義,其中包含任意數量的類型參數:
func Sort[T any](arr []T)
登錄后復制
在上面的示例中,T
是類型參數,代表可以是任何類型的項。
類型推斷
如果函數的泛型類型參數可以在上下文中推斷出來,則可以省略它們:
func Swap[T](x, y T)
登錄后復制
此函數可以與任何類型的兩個參數一起使用,Go 編譯器會推斷出 T
應該是 x
和 y
的類型。
實戰案例:二叉查找樹
讓我們創建一個二叉查找樹的泛型版本:
type Node[T any] struct { Value T Left *Node[T] Right *Node[T] } func Insert[T comparable](n *Node[T], value T) *Node[T] { // ... } func Search[T comparable](n *Node[T], value T) *Node[T] { // ... }
登錄后復制
這個二叉查找樹允許我們存儲和搜索任何可比較類型的元素。
類型約束
有時,您需要對類型參數施加約束。例如,為了確保在二叉查找樹中比較兩個值是有效的,我們可以要求 T
實現了 comparable
接口:
type Node[T comparable] struct { // ... }
登錄后復制
注意事項
Go 中的泛型并非類型模板,它們不會產生新的類型。
泛型類型參數不能被實例化。
類型推斷僅適用于調用函數時,而不適用于聲明函數時。
結論
Go 泛型為 Go 語言帶來了強大的新功能。了解如何定義和使用泛型是提高代碼靈活性和可重用性的關鍵。