泛型
泛型函数/类型、constraints 约束、comparable/any、类型推断
泛型
Go 1.18 引入泛型——类型参数 + 约束(constraint)。用 any 和 comparable 两个内置约束解决大部分场景。
学完本章你将: 掌握泛型函数/类型、constraints、comparable/any。
泛型函数
go
package main
import "fmt"
// 泛型 Min——适用于所有可排序类型
func Min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
func main() {
fmt.Println(Min(3, 5)) // 5
fmt.Println(Min(3.14, 2.72)) // 2.72
fmt.Println(Min("abc", "abd")) // "abc"
}
泛型类型
go
// 泛型集合
type Set[T comparable] map[T]struct{}
func NewSet[T comparable]() Set[T] {
return make(Set[T])
}
func (s Set[T]) Add(v T) {
s[v] = struct{}{}
}
func (s Set[T]) Contains(v T) bool {
_, ok := s[v]
return ok
}
常用约束
go
// any —— 任意类型(interface{} 的别名)
func Print[T any](v T) { fmt.Println(v) }
// comparable —— 可比较类型(== !=)
func Contains[T comparable](slice []T, item T) bool { }
// 自定义约束
type Number interface {
~int | ~int64 | ~float64 // ~ 支持底层类型
}
func Sum[T Number](nums []T) T {
var total T
for _, n := range nums {
total += n
}
return total
}