Go 泛型允許建立可重複使用類型和函數,不會修改程式碼本身。它包括:泛型類型:使用類型參數,允許在建立類型時指定參數類型(如 []T、map[K]V)。泛型函數:使用型別參數,必須指定明確的型別參數清單。約束:限制泛型類型的用法,使用關鍵字 any、comparable 和類型介面指定類型參數的類型限制。透過這些概念,可以建立更健全和通用的程式碼,例如泛型排序演算法。
理解Golang 泛型的核心概念
前言
泛型是在Go 1.18 中引入的一項重要新特性,它允許我們在不修改程式碼本身的情況下創建可重複使用的類型和函數。本教學將介紹 Go 中泛型的核心概念,並透過實戰案例來示範其用法。
泛型類型
泛型類型參數化了類型,允許我們在建立類型時指定參數類型。這可以透過使用[]T
或map[K]V
等型別建立器來實現,其中T
和V
分別是值類型和鍵類型。
// 定义一个泛型 slice 类型 type MySlice[T any] []T // 创建一个 MySlice[int] 实例 s := MySlice[int]{1, 2, 3}
泛型函數
泛型函數也可以使用型別參數,但它們也必須指定明確的型別參數清單。
// 定义一个将切片元素加倍的泛型函数 func Double[T ~int | ~float64](s []T) []T { for i, v := range s { s[i] = v * 2 } return s }
約束
約束允許我們透過指定類型參數的類型限制來限制泛型類型的用法。約束使用關鍵字 any
、comparable
和類型介面來實作。
// 定义一个泛型 map 类型,键值为可比较类型 type MyMap[K comparable, V any] map[K]V // 定义一个泛型函数来查找切片中的最大值 func Max[T any](s []T) T where T: ~int | ~float64 { max := s[0] for _, v := range s { if v > max { max = v } } return max }
實戰案例
讓我們建立一個使用泛型的簡單排序演算法:
// 定义泛型交换函数 func Swap[T any](s []T, i, j int) { temp := s[i] s[i] = s[j] s[j] = temp } // 定义泛型排序函数 func Sort[T any](s []T) where T: ~int | ~float64 | ~string { for i := 0; i < len(s); i++ { for j := i + 1; j < len(s); j++ { if s[j] < s[i] { Swap(s, i, j) } } } }
結論
Go 中泛型為程式碼重複使用和靈活性提供了強大的工具。透過理解類型參數化、約束和實戰案例,開發者可以利用這項功能創建更健壯和通用的程式碼。
以上是理解Golang泛型的核心概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!