Equal vs DeepEqual [已关闭]

Equal vs DeepEqual [closed]

提问人:ceving 提问时间:10/19/2023 最后编辑:jub0bsceving 更新时间:10/25/2023 访问量:68

问:


这个问题是由错别字或无法再现的问题引起的。虽然类似的问题可能在这里是主题,但这个问题的解决方式不太可能帮助未来的读者。

23天前关闭。

为什么 Equal 和 DeepEqual 之间有区别?

s1 := "abc"
s2 := "abc"

sv1 := reflect.ValueOf(s1)
sv2 := reflect.ValueOf(s2)

fmt.Println(sv1.Equal(sv2))
fmt.Println(reflect.DeepEqual(sv1, sv2))

第一个打印 true,第二个打印 false。

GO 反射 等式

评论

2赞 jub0bs 10/19/2023
reflect.DeepEqual的语义很少是你需要的。
0赞 ceving 10/19/2023
@jub0bs 我的期望是,它只是为嵌套数据结构添加了递归。
2赞 jub0bs 10/19/2023
这可能是你所期望的行为,但这是你想要的行为吗?怀疑。
0赞 ceving 10/20/2023
@mkopriva 如何访问未导出的字段?
0赞 ceving 10/20/2023
@mkopriva 有趣的是,在 Go 中导出只是化妆品。

答:

1赞 Wojciech Kaczmarek 10/25/2023 #1

我认为你走得太远了。

s1 := "abc"
s2 := "abc"

sv1 := reflect.ValueOf(s1)
sv2 := reflect.ValueOf(s2)

fmt.Println(s1 == s2)
fmt.Println(reflect.DeepEqual(s1, s2))

fmt.Println(sv1 == sv2)
fmt.Println(sv1.Equal(sv2))
fmt.Println(reflect.DeepEqual(sv1, sv2))

给:

true
true
false
true
false

深度等号增加了递归性,正确,并且在检查具体类型时可以正常工作。但是这些对象具有不同的表示形式。reflect.Value

您有什么特定原因需要查询对象吗?reflect.Value

无论如何,希望这会有所帮助。

评论

1赞 ceving 10/25/2023
我停止使用 .reflect.Value
0赞 ceving 10/25/2023
但我仍然不明白为什么:stackoverflow.com/questions/77357582/......
1赞 ceving 10/25/2023 #2

reflect.DeepEqual似乎需要一些手动拆箱,因为它将 S 视为 S 而不是 S(示例):reflect.Valuestructreflect.Value

reflect.DeepEqual(v1.Interface(), v2.Interface())