Go语言中reflect.Equal与DeepEqual为何存在差异?
为什么reflect.Equal和DeepEqual会有差异?
核心区别一句话说清:
reflect.Value.Equal()是比较两个Value对象包裹的底层实际值reflect.DeepEqual()是比较两个reflect.Value对象本身
具体拆解
为什么
sv1.Equal(sv2)返回true
这个Equal方法会直接取出两个reflect.Value里包裹的字符串值(都是"abc")做比较。Go里相同内容的字符串会被驻留,指向同一个底层数组,所以比较结果自然是true。为什么
reflect.DeepEqual(sv1, sv2)返回falseDeepEqual是用来比较任意Go值相等性的工具,当传入的是reflect.Value类型时,它会把这两个对象当成普通结构体来逐字段对比。虽然sv1和sv2包裹的字符串值相同,但它们是两个独立的reflect.Value实例,结构体内部的元数据(比如值的存储指针)并不完全一致,所以DeepEqual判定它们不相等。
如果想用DeepEqual比较底层的字符串值,得改成reflect.DeepEqual(sv1.Interface(), sv2.Interface()),这样就会直接对比两个字符串本身,结果就是true了。
内容的提问来源于stack exchange,提问作者ceving
相关产品推荐
相关产品推荐

