zl程序教程

您现在的位置是:首页 >  工具

当前栏目

golang reflect.DeepEqual深等价比较引用数据类型是否相等

Golang 是否 比较 数据类型 引用 相等 reflect 等价
2023-09-14 09:01:53 时间

golang reflect.DeepEqual深等价比较引用数据类型是否相等

reflect.DeepEqual

对于arrayslicemapstruct等类型,当比较两个值是否相等时,是不能使用==运算符的。

func DeepEqual(x, y interface{}) bool
  • 深度比较,反馈两个对象是否深等价。
  • 用来判断两个值是否深度一致
  • 使用reflect.DeepEqual来比较两个slicestructmap是否相等

基本类型值等比较会使用==,当比较arrayslice的成员、map映射的键值对、struct结构体的字段时,需要进行深入比对,比如map的键值对,对键只使用==,但值会继续往深层比对。

深等价

  • xynil或同non-nil
  • xy具有相同的长度
  • xy指向同一个底层数组所初始化的实体对象
&x[0] == &y[0]

注意

  • 一个non-nil的空切片和一个nil的切片并不是深等价的,比如[]byte{}[]byte{nil}是非等价的。
  • numbersboolsstringschannels使用==相等则是深等价的
func TestSlice(t *testing.T) {
    m1 := map[string]int{"id": 1, "pid": 0}
    m2 := map[string]int{"pid": 0, "id": 1}
    //t.Log(m1 == m2)//invalid operation: m1 == m2 (map can only be compared to nil)

    //map变量只能和空(nil)比较
    //t.Log(m1 == nil) //false
    //t.Log(m2 != nil) //true

    t.Log(reflect.DeepEqual(m1, m2)) //true
}

参考链接:https://www.jianshu.com/p/50380740d04a