golang interface对象的比较会同时比较类型和值
原创
©著作权归作者所有:来自51CTO博客作者Lucky小黄人的原创作品,请联系作者获取转载授权,否则将追究法律责任
今天使用以往的工具函数来判断对象是否存在于列表时,发现明明存在的元素,一直返回了 false,很奇怪,后来才想起来 interface类型的对象除了比较值,还会比较类型,类型不对,同样匹配不上。
func InArray(obj interface{}, array interface{}) bool {
targetValue := reflect.ValueOf(array)
switch reflect.TypeOf(array).Kind() {
case reflect.Slice, reflect.Array:
for i := 0; i < targetValue.Len(); i++ {
if targetValue.Index(i).Interface() == obj {
return true
}
}
case reflect.Map:
if targetValue.MapIndex(reflect.ValueOf(obj)).IsValid() {
return true
}
}
return false
}
func main(t *testing.T) {
obj := int64(234) // int64类型
arr := []int{234, 140, 13, 42, 319, 32, 523, 49, 380, 222}
ret := InArray(obj, arr)
fmt.Printf("result=%v\n", ret) // result=false
}
把 obj 对象改成 int 类型就能匹配上了
func main(t *testing.T) {
obj := 234 // int类型
arr := []int{234, 140, 13, 42, 319, 32, 523, 49, 380, 222}
ret := InArray(obj, arr)
fmt.Printf("result=%v\n", ret) // result=false
}
参考:刘丹冰大佬的 4、interface