golang interface对象的比较会同时比较类型和值

简介: golang interface对象的比较会同时比较类型和值

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

目录
打赏
0
0
0
0
13
分享
相关文章
golang pgx自定义PostgreSQL类型
golang的pgx驱动提供了大约70种PostgreSQL类型支持,但还是有一些类型没有涵盖,本文介绍如何自己编写代码支持特殊的类型。
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
139 0
【Golang】解决使用interface{}解析json数字会变成科学计数法的问题
【2月更文挑战第9天】解决使用interface{}解析json数字会变成科学计数法的问题
411 0
Golang 对象深拷贝的方案以及性能比较
文章探讨了在Go语言中实现对象深拷贝的三种方法:使用gob序列化、JSON序列化和定制化拷贝,并对比了它们在性能和代码复杂度方面的优劣,建议根据具体需求选择最适合的方法。
260 0
|
10月前
|
Go
Golang语言基础之接口(interface)及类型断言
这篇文章是关于Go语言中接口(interface)及类型断言的详细教程,涵盖了接口的概念、定义、实现、使用注意事项以及类型断言的多种场景和方法。
106 4
|
10月前
|
Go
Golang语言基础数据类型之字符类型
这篇文章介绍了Go语言中的字符类型,包括字符概述、byte和rune类型的定义、转义字符的使用以及如何遍历字符串获取字符的示例。
60 0
Golang底层原理剖析之类型系统,接口与类型断言
Golang底层原理剖析之类型系统,接口与类型断言
159 2
Golang随笔之自动类型推导[:=]踩坑
Golang随笔之自动类型推导[:=]踩坑
73 0
浅谈Golang接口interface
浅谈Golang接口interface
100 0
Golang底层原理剖析之string类型与字符编码
Golang底层原理剖析之string类型与字符编码
121 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问