泛型
Go 1.18 引入泛型(type parameters),用于编写对多种类型通用且保留编译期类型检查的代码,消除了大量基于 interface{} + 类型断言的样板代码。
泛型函数
在函数名后用方括号声明类型参数:
调用时类型参数通常可自动推断,无需显式书写 Contains[int](...)。
约束
约束限定类型参数的能力集合,通过接口表达。
内置约束
自定义约束
Tip
约束设计建议:先考虑接口能否满足需求(约束本质是接口);需要运算符(+、< 等)时才使用带 ~ 底层类型的联合类型约束。
泛型类型
类型参数同样适用于结构体定义:
使用原则
:::warning 泛型并非万能。官方建议:
- 优先使用普通函数与接口;仅当所有类型的逻辑完全一致时才引入泛型。
- 不要用泛型替代接口实现"运行时多态",接口关注行为抽象,泛型关注类型无关的算法。
- 避免为单一调用场景定义只有一个实现的泛型约束。 :::
典型适用场景:通用容器(栈、队列)、工具函数(Map/Filter/Reduce)、缓存、以及 slices、maps 标准库中的算法。
小结
- 类型参数写在函数名或类型名后的方括号中,可自动推断。
- 约束即接口:
comparable、cmp.Ordered为常用内置约束,联合类型 +~支持运算符。 - 泛型解决类型无关算法的重复代码,接口解决行为多态,两者互补。