基本概念
類型形參、類型實參、類型約束和泛型類型
type Slice[T int|float32|float64 ] []T
類型形參 T
。類型占位符,不表示具體的類型
類型約束 int|float32|float64
。 中間的 |
的意思是告訴編譯器,類型形參 T
只可以接收 int
或 float32
或 float64
這三種類型的實參
類型參數列表 T int|float32|float64
泛型類型 type Slice[T int|float32|float64 ] []T
。完整的泛型類型定義
泛型類型實例化
// 這里傳入了類型實參int,泛型類型Slice[T]被實例化為具體的類型 Slice[int]
var a Slice[int] = []int{1, 2, 3}
類型實參 Slice[int]
中的 int
泛型Receiver
func (s Slice[T]) Sum() T {
var sum T
for _, value := range s {
sum += value
}
return sum
}
var s Slice[int] = []int{1, 2, 3, 4}
fmt.Println(s.Sum()) // 輸出:10
var s2 Slice[float32] = []float32{1.0, 2.0, 3.0, 4.0}
fmt.Println(s2.Sum()) // 輸出:10.0
泛型函數
func Add(a int, b int) int {
return a + b
}
func Add[T int|float32|float64](a T, b T) T {
return a + b
}
Add[int](1,2) // 傳入類型實參int,計算結果為 3
Add[float32](1.0, 2.0) // 傳入類型實參float32, 計算結果為 3.0
Add[string]("hello", "world") // 錯誤。因為泛型函數Add的類型約束中并不包含string
Go標準庫提供的泛型庫
slices,maps 庫
var list []int{3, 2, 1}
slices.Sort(list) //排序
slices.Reverse(list) //翻轉
slices.Contains(list, 1) //是否包含
...
m := map[string]int{
"a": 1,
"b": 2,
"c": 3,
}
maps.Keys(m) //提取 key ["a", "b", "c"]
maps.Values(m) //提取 value [1, 2, 3]
maps.Clone(m) //克隆
...
總結
當你需要針對不同類型書寫同樣的邏輯,使用泛型來簡化代碼是最好的 (比如寫個隊列,寫個鏈表、棧、堆之類的數據結構)
https://segmentfault.com/a/1190000041634906#item-2