Go泛型编程:是否有支持>操作的内置可比较接口?
Go泛型切片最大值函数的类型约束问题
你遇到的问题很明确:comparable这个内置约束只限定类型能进行==和!=比较,并不支持>这类大小比较操作,所以代码里的e > m会报错。
Go标准库没有内置支持大小比较的通用接口,你需要自行定义一个包含所有可排序类型的约束。
解决方法:自定义Ordered约束
先定义一个覆盖所有支持大小比较类型的接口:
type Ordered interface { ~int | ~int8 | ~int16 | ~int32 | ~int64 | ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ~float32 | ~float64 | ~string }
这里用~前缀是为了让自定义类型别名(比如type MyInt int)也能满足这个约束,增强函数的通用性。
然后修改你的SliceMax函数,把约束换成Ordered:
import "errors" func SliceMax[T Ordered](ts []T) (T, error) { if len(ts) == 0 { var zero T // 用类型零值替代硬编码的0,适配非数值类型 return zero, errors.New("cannot get max from empty slice") } m := ts[0] for _, e := range ts { if e > m { m = e } } return m, nil }
另外注意:原来返回0的写法有问题,如果T是string这类非数值类型,0无法转换为T,所以改用var zero T来获取对应类型的零值,保证代码兼容性。
内容的提问来源于stack exchange,提问作者aronchick
相关产品推荐
相关产品推荐

