使用用户定义的键映射用户定义的相等性?

标签 go

假设我在 Go 中有一个结构类型,我想将其用作映射中的键,但我想使用 Go 的内置相等操作。构建此类 map 的最佳方法是什么?

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

type Key struct {
    a *int
}

func Equal(x Key, y Key) bool {
    return *x.a == *y.a
}

如何构建使用 Equal 进行键比较的 map ?

最佳答案

Go 有 strict comparable semantics for values used as map keys .因此,您无法像在许多其他语言中那样为映射键定义自己的哈希码和相等函数。

但是,请考虑以下解决方法。不要将结构实例直接用作键,而是使用结构的派生属性,该属性本质上可用作键并具有您想要的相等语义。通常很容易将整数或字符串值导出为哈希码,用作实例的标识。

例如:

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,则该实例不能再用作哈希键,因为它的标识已更改。

关于使用用户定义的键映射用户定义的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29662003/

相关文章:

multithreading - Go 服务器在发送 INT 信号后挂起

bash - Docker/bin/sh 未找到二进制 go 文件

loops - 如何将多个值从模板传递到模板?

go - 是否可以使用 for 循环迭代 golang 中的返回函数?

go - mac系统无法使用GoLang安装Beego框架

go - 如何打印函数的返回值?

algorithm - 如何使用go识别给定号码的匹配模式?

go - 在 golang 中安装 "context"包?

go - 软层 SDK SoftLayer_Exception_Public : Access Denied

go - 函数/结构/接口(interface)名称中允许使用哪些字符?