0
点赞
收藏
分享

微信扫一扫

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

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

  • ​​https://studygolang.com/pkgdoc​​

reflect.DeepEqual

对于​​array​​​、​​slice​​​、​​map​​​、​​struct​​​等类型,当比较两个值是否相等时,是不能使用​​==​​运算符的。

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

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

深等价

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

注意

  • 一个​​non-nil​​​的空切片和一个​​nil​​​的切片并不是深等价的,比如​​[]byte{}​​​和​​[]byte{nil}​​是非等价的。
  • ​numbers​​​、​​bools​​​、​​strings​​​、​​channels​​​使用​​==​​相等则是深等价的
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


举报

相关推荐

0 条评论