Go Map 中的自定义键比较
在 Go 中,映射需要可比较的键,但有时需要自定义相等操作。当自定义数据结构(例如用户定义的结构)用作映射键时,就会出现这种情况。
为了规避此限制,一种解决方法是从用作映射的结构中派生一个单独的属性钥匙。此派生属性应具有所需的相等语义,并且本质上应可用作键。
考虑以下示例:
type Key struct { a *int } func (k *Key) HashKey() int { return *k.a }
在此示例中,HashKey 方法派生一个整数值,该值代表Key的身份。然后可以使用此派生属性构造映射:
k1, k2 := Key{intPtr(1)}, Key{intPtr(2)} m := map[int]string{} m[k1.HashKey()] = "one" m[k2.HashKey()] = "two" fmt.Println(m) // Outputs: map[1:one 2:two]
请注意,键比较仅依赖于 HashKey() 方法,允许自定义相等语义。
不变性注意事项
但是,使用这种方法时,不变性至关重要。如果原始结构体的字段被修改,则该实例不能再用作映射键,因为它的身份已更改。
以上是如何在 Go Map 中实现自定义键比较?的详细内容。更多信息请关注PHP中文网其他相关文章!