gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:07:07 24 4
gpt4 key购买 nike

假设我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com