Go 1.18 引入了泛型,这是 Go 发布以来最大的语言变化。泛型让 Go 程序员可以用类型参数编写可复用的代码,同时保持 Go 简洁的编程风格。
类型参数
// 泛型函数
func Map[T any, U any](s []T, f func(T) U) []U {
result := make([]U, len(s))
for i, v := range s {
result[i] = f(v)
}
return result
}
// 使用
doubled := Map([]int{1, 2, 3}, func(n int) int { return n * 2 })
类型约束
通过接口定义类型约束,限定类型参数可以接受的具体类型。标准库提供了 constraints 包的预定义约束:
- any:等价于 interface{},接受所有类型。
- comparable:可用 == 和 != 比较的类型。
- ~int | ~float64:接近约束,包括底层类型为 int/float64 的自定义类型。
注意事项
泛型不是所有场景的最佳选择:只在真正需要多类型支持时使用泛型;接口仍然是行为抽象的首选;过度使用泛型会让代码变得难以阅读。
泛型是 Go 工具箱中的又一件利器——有力但需要克制地使用。