提问人:ceving 提问时间:10/19/2023 最后编辑:jub0bsceving 更新时间:10/25/2023 访问量:68
Equal vs DeepEqual [已关闭]
Equal vs DeepEqual [closed]
问:
为什么 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。
答:
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.Value
struct
reflect.Value
reflect.DeepEqual(v1.Interface(), v2.Interface())
评论
reflect.DeepEqual
的语义很少是你需要的。