今天使用以往的工具函数来判断对象是否存在于列表时,发现明明存在的元素,一直返回了 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​