Go 中具有用户定义相等性的自定义映射键
在 Go 中,映射对映射键采用严格的可比较语义。这意味着程序员无法像在其他语言中那样实现自己的哈希函数和映射键的相等操作。
要解决此限制,请考虑另一种方法。不要直接使用结构体实例作为键,而是使用结构体的派生属性作为合适的映射键并遵守所需的相等语义。在许多情况下,派生整数或字符串值作为表示实例身份的哈希码是可行的。
确保派生哈希码中的冲突仅在表明实例的真实语义身份时才会发生,这一点至关重要存储的值。这意味着相应的值应该是可以互换的。
例如:
type Key struct { a *int } func (k *Key) HashKey() int { return *(*k).a } k1, k2 := Key{intPtr(1)}, Key{intPtr(2)} m := map[int]string{} m[k1.HashKey()] = "one" m[k2.HashKey()] = "two" // m = map[int]string{1:"one", 2:"two"} m[k1.HashKey()] // => "one"
但是,在使用这种方法时要注意不变性问题。如果修改了上例中的 a 字段,该实例就不能再作为哈希键,因为它的身份已经改变。
以上是如何在 Go 中实现映射键的自定义相等性?的详细内容。更多信息请关注PHP中文网其他相关文章!