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 包的预定义约束:

注意事项

泛型不是所有场景的最佳选择:只在真正需要多类型支持时使用泛型;接口仍然是行为抽象的首选;过度使用泛型会让代码变得难以阅读。

泛型是 Go 工具箱中的又一件利器——有力但需要克制地使用。