Go 是否使用具有用户定义等式的用户定义键进行映射?

Go 是否使用具有用户定义等式的用户定义键进行映射?,go,Go,假设我在Go中有一个结构类型,我想在映射中用作键,但我不想使用Go的内置相等操作。构建这样一张地图的最佳方式是什么 下面是我的键类型和相等操作的一个具体示例: type Key struct { a *int } func Equal(x Key, y Key) bool { return *x.a == *y.a } 如何构建使用Equal进行键比较的映射?这在Go中是不可能的。没有可以重写的运算符重载或“相等”方法(因为不是从.NET之类的公共基类继承,您的示例让我想起了

假设我在Go中有一个结构类型,我想在映射中用作键,但我不想使用Go的内置相等操作。构建这样一张地图的最佳方式是什么

下面是我的键类型和相等操作的一个具体示例:

type Key struct {
    a *int
}

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

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

这在Go中是不可能的。没有可以重写的运算符重载或“相等”方法(因为不是从.NET之类的公共基类继承,您的示例让我想起了这一点)。如果你感兴趣,这个答案有更多关于平等比较的信息

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

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
,则实例不能再用作散列键,因为其标识已更改。

但我如何声明映射应使用该方法?更糟糕的是,在我的真实代码中,字段a是int的一个片段,据我所知,silces没有内置的相等操作。是的,在常见问题解答中有一个问题是“为什么地图不允许片段作为键”,答案是没有内置的相等操作符。我在回答中提出了我认为最合理的解决方案。谢谢。在我的真实代码中,我使用片段作为键。我想我必须对128位的值使用一个非常高质量的散列,或者将它们“散列”到字符串。@ArchD.Robison:当然,内置的可能会有帮助,甚至是切片的简单字符串表示。