Go 1.18 带来了泛型的特性,现在 Go 1.18 Beta 1 已可已使用,初步体验一下 Go 泛型。
简单使用
分别写一个 string 类型和 int 类型各自相加的函数
func AddInt(a, b int) int { return a + b } func AddString(a, b string) string { return a + b }现在是用泛型只需要写一个函数就能给解决
package main import ( "fmt" ) func Add[T int | string](a, b T) T { return a + b } func main() { fmt.Println("add ", Add(10, 10)) // 20 fmt.Println("add ", Add("10", "10")) // 1010 }模仿 new 方法
package main import ( "fmt" ) func New[T any]() *T { return new(T) } func main() { // new 0x1400012c008 fmt.Println("new", New[int]()) }空接口替换成
anypackage main import ( "fmt" ) func IntfaceToAny(p any) any { return p } func IntfaceToAny2[T string](str T, args ...any) { fmt.Print(str) for _, v := range args { fmt.Printf("%q", v) } } func main() { str := IntfaceToAny("hello") num := IntfaceToAny(123) IntfaceToAny2("hello ", 'w', 'o', 'r', 'l', 'd') fmt.Println("\nany ", str, num) }联合类型约束
package main import "fmt" type Number interface { int | int64 | float64 } func SumNumbers[K comparable, V Number](m map[K]V) V { var s V for _, v := range m { s += v } return s } func main() { sum := SumNumbers(make(map[string]int64, 0)) fmt.Println("sum", sum) }以上例子中 V 的类型
Number是一个 int、int64、float64 的联合类型,comparable是 Go 内置类型约束,它的值是可用于比较的任何类型,Go 要求 map 的键具有课比较性,所以这里将 K 的类型约束设置为comparable。结构体上使用泛型
package main import "fmt" // 结构体 泛型 type List[T any] struct { Code int Data T Message string } func New[T any]() *T { return new(T) } func main() { newList := New[List[[]int]]() fmt.Println("newList", newList) // newList &{0 [] } } ``` 以上是一些简单的用法,泛型可以写很复杂的逻辑,还要等待以后慢慢发掘。
