Go 1.18 引入泛型(类型参数),定位为弥补特定场景,而非泛化一切。适合的场景:容器和数据结构(泛型 slice/map 工具,如 slices、maps 标准库包);与业务类型无关的算法(Min/Max、Filter、Reduce);需要类型安全的通用约束(如泛型 channel、泛型缓存)。
不该用的场景:用泛型替代接口做运行时多态——泛型是编译期实例化,不能替代接口的动态分派;为了少写几行重复代码而上泛型,导致可读性下降;把类型断言链改写成泛型但逻辑仍按类型分支。官方建议:'先写具体代码,出现多种类型的明显重复时再泛化'。约束用 interface 表达,如 cmp.Ordered、~int 支持底层类型匹配。
func Map[T, U any](s []T, f func(T) U) []U {
out := make([]U, len(s))
for i, v := range s { out[i] = f(v) }
return out
}
nums := Map([]int{1, 2}, strconv.Itoa)
易错点:泛型方法不能有自己的类型参数(只能用在 receiver 声明的类型参数上);泛型不带来运行时性能提升(GC shape stenciling 有少量开销)。追问方向:~ 底层类型约束、泛型与接口的边界、标准库 slices/maps 的设计。