Go语言是否存在覆盖所有整数、浮点类型的Number接口?
结论
Go完全支持定义覆盖所有整数、浮点类型的通用泛型接口,官方泛型教程里只包含int64 | float64的Number只是教学用的极简示例,不代表语言层面做不到全量数值类型的覆盖。
细节说明
- 教程里的示例刻意裁剪了类型范围,只是为了用最少的代码演示泛型类型约束的核心逻辑,不是生产环境可用的完整定义。
- 你只需要在接口的类型集中枚举所有基础数值类型,就能得到覆盖全部整数、浮点类型的通用约束,参考实现:
type Number interface { // 全部有符号整数类型 int | int8 | int16 | int32 | int64 | // 全部无符号整数类型 uint | uint8 | uint16 | uint32 | uint64 | uintptr | // 全部浮点类型 float32 | float64 }
- 如果需要兼容底层基于上述基础类型定义的自定义数值类型,只要给每个类型前加上近似匹配符号
~即可,比如写成~int | ~int8的形式,类似type MyInt int的自定义类型也能正常匹配这个约束。 - 要注意这类基于类型集实现的接口仅能作为泛型约束使用,不能像普通接口一样用来声明运行时变量,这是Go泛型的固有语法规则,和能不能覆盖全量数值类型没有关系。
- 目前官方也提供了预置的全量数值类型约束定义,不想手动枚举所有类型也可以直接使用官方现成的实现。
内容的提问来源于stack exchange,提问作者guettli
相关产品推荐
相关产品推荐

