读完一篇后相关问题 https://stackoverflow.com/questions/20297503/slice-as-a-key-in-map关于在映射中使用切片,我对 Go 中的相等性感到好奇。
我知道可以覆盖equals
Java 的方法Object
。是否有类似的方法来定义 Go 如何检查用户定义的类型/结构是否相等?如果是这样,就会有一个解决上述问题的方法。我想用interface{} values http://play.golang.org/p/8CzhmDnDLQ可能会提供解决方案,但我收到了错误消息panic: runtime error: hash of unhashable type []int
.
No。您无法修改相等运算符,并且没有内置方法来添加对要使用的自定义类型的支持==
句法。相反,您应该使用比较指针值reflect.DeepEqual https://golang.org/pkg/reflect/#DeepEqual.
Go 支持相等检查结构。
type Person struct {
Name string
}
a := Person{"Bill DeRose"}
b := Person{"Bill DeRose"}
a == b // true
它不适用于指针字段(以您想要的方式),因为指针地址不同。
type Person struct {
Friend *Person
}
a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}
a == b // false
import "reflect"
a := Person{Friend: &Person{}}
b := Person{Friend: &Person{}}
reflect.DeepEqual(a, b) // true
请记住,有一些警告。
一般来说,DeepEqual 是 Go 的 == 运算符的递归松弛。然而,如果没有一些不一致之处,这个想法是不可能实现的。具体来说,一个值有可能不等于自身,要么因为它是 func 类型(一般情况下不可比较),要么因为它是浮点 NaN 值(在浮点比较中不等于自身),或者因为它是包含此类值的数组、结构或接口。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)