使用具有用户定义相等性的用户定义键进行映射?

假设我有去,我想作为一个地图一键使用结构类型,但我不希望使用Go的内置平等的操作。构建这种地图的最佳方法是什么?


对于一个具体的例子,这是我的键类型和相等操作:


type Key struct {

    a *int

}


func Equal(x Key, y Key) bool {

    return *x.a == *y.a

}

如何构建Equal用于关键比较的地图?


Smart猫小萌
浏览 182回答 2
2回答

30秒到达战场

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则该实例不能再用作哈希键,因为其身份已更改。

HUX布斯

这在 Go 中是不可能的。没有您可以覆盖的运算符重载或“平等”方法(因为不是从像 .NET 这样的公共基类继承的,您的示例让我想起了)。正如评论中提到的,如果你想做这样的工作,我建议使用对象上的属性作为键。您可以根据您如何设置该属性的值来定义相等性(例如,如果您正在寻找成员相等性,它可能是对象字节的校验和或其他东西)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go