标准答案

  1. 类型参数让 slice、集合和通用算法在编译期保留类型安全。
  2. 接口适合调用方依赖行为而不是具体类型的场景。
  3. 泛型约束要表达真实操作集合,过于复杂的约束会增加调用和错误信息成本。
  4. 性能和代码生成行为要以目标 Go 版本和 benchmark 验证。

题目解析

泛型适合同一算法或数据结构需要支持多个类型,并且操作集合可以用约束表达;接口适合调用方依赖行为、多态实现和运行时替换。两者解决的变化维度不同。

复杂约束会增加阅读、编译和错误信息成本。若普通函数、接口或代码生成已经清楚,泛型不一定带来收益。any 会重新放弃编译期检查。

性能取决于目标 Go 版本、调用模式和编译器实现,不能笼统说泛型一定比接口快。用 benchmark、allocs 和业务 profile 验证。

常见误区

  • 误区:用 any 重新失去类型安全。改正:用准确的类型参数和约束,运行时类型不确定时明确校验。
  • 误区:为简单函数写复杂类型约束。改正:先用普通函数或清晰接口,只有重复算法真正受益时才泛型化。
  • 误区:认为泛型一定比接口快。改正:以目标版本和实际 benchmark/profile 为准。

作者信息