Go泛型使用==报type parameter T is not comparable问题咨询
问题1解答
Go 确实内置了comparable类型约束,专门用来表示所有支持==、!=运算符的类型,可以直接替换你代码里的any来声明类型参数,修改后的泛型函数代码如下:
func array_has[T comparable](haystack []T, needle T) bool { for _, val := range haystack { if val == needle { return true } } return false }
修改后你的示例代码可以正常编译运行,输出结果为false。
问题2解答
Go 中确实存在不支持==比较的类型,常见的包括:
- 切片类型(
[]T) - Map 类型(
map[K]V) - 函数类型(
func) - 包含上述不可比较类型的结构体、数组类型
这类类型如果直接使用==进行比较,编译阶段就会直接报错。
额外说明:你当前使用reflect绕过编译检查的方案存在运行时风险,当传入的T是上述不可比较类型时,运行到reflect比较逻辑会直接触发panic,并不是安全的通用方案。如果要支持不可比较类型的存在性判断,需要针对对应类型单独实现比较逻辑,或者传入自定义的比较函数作为参数。
内容的提问来源于stack exchange,提问作者Tasos Bitsios
相关产品推荐
相关产品推荐

