标准答案
- 类型参数让 slice、集合和通用算法在编译期保留类型安全。
- 接口适合调用方依赖行为而不是具体类型的场景。
- 泛型约束要表达真实操作集合,过于复杂的约束会增加调用和错误信息成本。
- 性能和代码生成行为要以目标 Go 版本和 benchmark 验证。
题目解析
泛型适合同一算法或数据结构需要支持多个类型,并且操作集合可以用约束表达;接口适合调用方依赖行为、多态实现和运行时替换。两者解决的变化维度不同。
复杂约束会增加阅读、编译和错误信息成本。若普通函数、接口或代码生成已经清楚,泛型不一定带来收益。any 会重新放弃编译期检查。
性能取决于目标 Go 版本、调用模式和编译器实现,不能笼统说泛型一定比接口快。用 benchmark、allocs 和业务 profile 验证。
常见误区
- 误区:用 any 重新失去类型安全。改正:用准确的类型参数和约束,运行时类型不确定时明确校验。
- 误区:为简单函数写复杂类型约束。改正:先用普通函数或清晰接口,只有重复算法真正受益时才泛型化。
- 误区:认为泛型一定比接口快。改正:以目标版本和实际 benchmark/profile 为准。