go 語言支持泛型納入了 go2 的規划 在線體驗 https://go2goplay.golang.org/
本文是 go 泛型的實踐過程詳解
這是一篇不錯的 泛型介紹 Go 語言:全面分析為什么我們需要泛型 - 講解了泛型的優點、缺點、和 go 在泛型上的實現方案。本文不再具體介紹
簡單說 泛型是與類型無關的算法。
實踐過程
1. 編譯 go 安裝包 dev.go2go 分支
2. 安裝新編譯的 go 程序
3. 使用新的 go 編譯泛型代碼(文件后綴名.go2)
4. 例子一 print.go2
package main import ( "fmt" ) func Print[T any](s []T) { for _, v := range s { fmt.Print(v) } } func main() { Print([]string{"Hello, ", "playground\n"}) }
5. 執行 go tool go2go run filename.go2
6. 例子二 indexof.go2
package main import ( "fmt" ) func IndexOf[T comparable](arr []T, value T) int { for i, v := range arr { if v == value { return i } } return -1 } func main() { q := []uint{1,2,3,4,5} fmt.Println(IndexOf(q, 5)) // 5 str := []string{"xi","an","shi","gao","xin","qu"} fmt.Println(IndexOf(str,"gao")) // 3 fmt.Println(IndexOf(str,"xii")) // -1 }
7. go tool go2go translate indexof.go2 將 .go2 文件 翻譯成 .go 文件
根據翻譯得來的 .go 文件 印證了 Go 語言:全面分析為什么我們需要泛型 中所講的 go 實現泛型是根據模板進行實例化代碼
// Code generated by go2go; DO NOT EDIT. //line indexof.go2:1 package main //line indexof.go2:1 import "fmt" //line indexof.go2:17 func main() { q := []uint{1, 2, 3, 4, 5} fmt.Println(instantiate୦୦IndexOf୦uint(q, 5)) str := []string{"xi", "an", "shi", "gao", "xin", "qu"} fmt.Println(instantiate୦୦IndexOf୦string(str, "gao")) fmt.Println(instantiate୦୦IndexOf୦string(str, "xii")) } //line indexof.go2:7 func instantiate୦୦IndexOf୦uint(arr []uint, value uint,) int { for i, v := range arr { if v == value { return i } } return -1 } //line indexof.go2:7 func instantiate୦୦IndexOf୦string(arr []string, value string,) int { for i, v := range arr { if v == value { return i } } return -1 } //line indexof.go2:15 type Importable୦ int //line indexof.go2:15 var _ = fmt.Errorf
8. 泛型的范圍 - func IndexOf[T comparable](arr []T, value T)
1. comparable 可比較的
```go
func IndexOf[T comparable](arr []T, value T) int {
for i, v := range arr {
if v == value {
return i
}
}
return -1
}
```
2. any 任意的
```go
func Print[T any](s []T) {
for _, v := range s {
fmt.Print(v)
}
}
```
3. 自定義
```go
type numeric interface { // 支持的類型
type string,int, int8, int16, int32, int64, uint, uint8, uint16, uint32, uint64, float32, float64
}
func min[T numeric](a, b T) T {
if a < b {
return a
}
return b
}
```