1.泛型函数
func FuncName[T C](ele ...T)(sum T) {}
T 泛型类型
C 类型集合
例如:
package main
import "fmt"
// 类型集合,~表示的是匹配该类型以及该类型衍生出来的任何类型
func ComSum[T int | ~float64](eles ...T) (sum T) {
for _, v := range eles {
sum += v
}
return sum
}
// any关键字泛型匹配
func Print[T any](v T) {
fmt.Println(v)
}
func main() {
fmt.Println(ComSum(1, 2, 3))
fmt.Println(ComSum(1.1, 2.2, 3.3))
Print[int](1)
Print[string]("name")
}
输出:
[root@master01 goGeneris]# go run generis_0.go
6
6.6
1
name
泛型不支持直接进行运算:
package main
import (
"fmt"
)
// 不支持泛型类型直接进行运算
func Add[T any](a, b T) T {
return a + b
}
func main() {
Add(1, 2)
}
运行报错:
./generis_0.go:22:9: invalid operation: operator + not defined on a (variable of type T constrained by any)
2.泛型接口类型集
// 接口类型
type ST interface {
~int | ~int64 | ~string
}
// 泛型函数可以简化类型集
func AllType[T ST](v T) {
fmt.Println(v)
}
例如:
package main
import (
"fmt"
)
// 接口类型
type ST interface {
~int | ~int64 | ~string
}
// 泛型函数可以简化类型集
func AllType[T ST](v T) {
fmt.Println(v)
}
func main() {
AllType(1)
AllType(1111)
AllType("CCCCCCC")
}
3.接口类型结机构不支持
// 不持不定参数结构
type SST[Ts ...comparable] struct{
}
4.多类型跟多参数函数
package main
import (
"fmt"
"strconv"
)
// 多模板多参数函数
func KLn[T, R any](s []T, f func(T) R) []R {
result := make([]R, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
func main() {
fc := func(s string) int {
v, _ := strconv.Atoi(s)
return v
}
ret := KLn([]string{"1", "2", "3"}, fc)
fmt.Println(ret)
// 指定类型
ret = KLn[string, int]([]string{"4", "5", "6"}, fc)
fmt.Println(ret)
}
5.泛型方法
package main
import "fmt"
// 模板结构类型
type XT[T any] struct {
u T
}
// 不支持泛型函数
// func (t XT) Kan(v any) {
// }
// 不支持,方法必须有类型参数才行
// func (t T) Kdn(v any) {}
// *** 泛型类型定义泛型方法
func (t XT[T]) Ksn(v any) {
}
func main() {
sxt := XT[string]{
u: "hello",
}
fmt.Println(sxt.u)
ixt := XT[int]{
u: 111,
}
fmt.Println(ixt.u)
}