go 语言支持泛型纳入了 go2 的规划 在线体验 https://go2goplay.golang.org/
本文是 go 泛型的实践过程详解
这是一篇不错的 泛型介绍 Go 语言:全面分析为什么我们需要泛型 - 讲解了泛型的优点、缺点、和 go 在泛型上的实现方案。本文不再具体介绍
简单说 泛型是与类型无关的算法;
实践过程
1. 编译 go 安装包 dev.go2go 分支 2. 安装新编译的 go 程序 3. 使用新的 go 编译泛型代码(文件后缀名.go2) 4. 例子一 print.go2
代码语言:javascript复制package main
import (
"fmt"
)
func Print[T any](s []T) {
for _, v := range s {
fmt.Print(v)
}
}
func main() {
Print([]string{"Hello, ", "playgroundn"})
}
5. 执行 go tool go2go run filename.go2
6. 例子二 indexof.go2
代码语言:javascript复制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 实现泛型是根据模板进行实例化代码
代码语言:javascript复制// 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 } ```