为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Smart猫小萌 2021-09-27 21:16:36
假设我有去,我想作为一个地图一键使用结构类型,但我不希望使用Go的内置平等的操作。构建这种地图的最佳方法是什么?对于一个具体的例子,这是我的键类型和相等操作:type Key struct {    a *int}func Equal(x Key, y Key) bool {    return *x.a == *y.a}如何构建Equal用于关键比较的地图?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-09-27
?
HUX布斯

TA贡献1876条经验 获得超6个赞

这在 Go 中是不可能的。没有您可以覆盖的运算符重载或“平等”方法(因为不是从像 .NET 这样的公共基类继承的,您的示例让我想起了)。

正如评论中提到的,如果你想做这样的工作,我建议使用对象上的属性作为键。您可以根据您如何设置该属性的值来定义相等性(例如,如果您正在寻找成员相等性,它可能是对象字节的校验和或其他东西)。


查看完整回答
反对 回复 2021-09-27
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信