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

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