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
}