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

相关文章
|
1天前
|
存储 Go
Golang底层原理剖析之slice类型与扩容机制
Golang底层原理剖析之slice类型与扩容机制
25 0
|
1天前
|
JSON Go 数据格式
【Golang】解决使用interface{}解析json数字会变成科学计数法的问题
【2月更文挑战第9天】解决使用interface{}解析json数字会变成科学计数法的问题
54 0
|
6月前
|
关系型数据库 Go PostgreSQL
golang pgx自定义PostgreSQL类型
golang的pgx驱动提供了大约70种PostgreSQL类型支持,但还是有一些类型没有涵盖,本文介绍如何自己编写代码支持特殊的类型。
87 3
|
7月前
|
安全 Go
Golang 语言的编程技巧之类型
Golang 语言的编程技巧之类型
37 0
|
7月前
|
存储 安全 编译器
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
Golang 语言中 map 的键值类型选择,它是并发安全的吗?
33 0
|
7月前
|
Go
Golang 语言怎么打印结构体指针类型字段的值?
Golang 语言怎么打印结构体指针类型字段的值?
172 0
|
7月前
|
存储 安全 Go
Golang 语言 method 接收者使用值类型和指针类型的区别
Golang 语言 method 接收者使用值类型和指针类型的区别
30 0
|
1天前
|
Go
浅谈Golang接口interface
浅谈Golang接口interface
19 0
|
1天前
|
存储 缓存 Go
Golang底层原理剖析之类型系统,接口与类型断言
Golang底层原理剖析之类型系统,接口与类型断言
53 2
|
1天前
|
存储 编译器 Go
Golang底层原理剖析之string类型与字符编码
Golang底层原理剖析之string类型与字符编码
29 0