泛型(Go 1.18+)
类型形参
go
func Min[T constraints.Ordered](a, b T) T {
if a < b {
return a
}
return b
}
调用时可显式 Min[int](1, 2) 或依赖类型推断 Min(1, 2)。
类型约束
- 接口作为约束:满足该接口的类型集可作为
T。 constraints.Ordered(标准库constraints,自 Go 1.18):满足<等有序比较的类型集合;Go 1.21+ 亦常用cmp.Compare/cmp.Less配合泛型工具。comparable:预声明约束,可用==/!=的类型(含许多具体类型与接口比较规则)。
go
func Keys[K comparable, V any](m map[K]V) []K {
out := make([]K, 0, len(m))
for k := range m {
out = append(out, k)
}
return out
}
泛型类型
go
type Node[T any] struct {
Value T
Next *Node[T]
}
方法可带额外接收者类型形参(较少用):
go
func (n *Node[T]) Clear() {
var zero T
n.Value = zero
}
限制与注意
- 不能用类型形参做类型断言的目标(如
x.(T)非法)。 - 泛型函数内不能声明同名类型形参与外层类型同名遮蔽易混,注意命名。
- 实例化后单态化(monomorphization)风格由编译器实现;性能通常接近手写特化,极端热点应用
pprof验证。
标准库泛型 API
Go 1.21+:slices、maps、cmp 等包提供切片/映射的泛型工具函数,优先复用而非自写。