You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go语言中reflect.Equal与DeepEqual为何存在差异?

为什么reflect.Equal和DeepEqual会有差异?

核心区别一句话说清:

  • reflect.Value.Equal() 是比较两个Value对象包裹的底层实际值
  • reflect.DeepEqual() 是比较两个reflect.Value对象本身

具体拆解

  1. 为什么sv1.Equal(sv2)返回true
    这个Equal方法会直接取出两个reflect.Value里包裹的字符串值(都是"abc")做比较。Go里相同内容的字符串会被驻留,指向同一个底层数组,所以比较结果自然是true。

  2. 为什么reflect.DeepEqual(sv1, sv2)返回false
    DeepEqual是用来比较任意Go值相等性的工具,当传入的是reflect.Value类型时,它会把这两个对象当成普通结构体来逐字段对比。虽然sv1和sv2包裹的字符串值相同,但它们是两个独立的reflect.Value实例,结构体内部的元数据(比如值的存储指针)并不完全一致,所以DeepEqual判定它们不相等。

如果想用DeepEqual比较底层的字符串值,得改成reflect.DeepEqual(sv1.Interface(), sv2.Interface()),这样就会直接对比两个字符串本身,结果就是true了。

内容的提问来源于stack exchange,提问作者ceving

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:27:39