dictionary - 如何在go中为哈希映射制作复合键
问题描述
首先,我对复合键的定义 - 两个或多个值组合成键。不要与数据库中的复合键混淆。
我的目标是将计算值保存pow(x, y)
在哈希表中,其中x
和y
是整数。这就是我需要有关如何制作密钥的想法的地方,以便给定x
和y
,我可以在哈希表中查找它,以找到pow(x,y)
.
例如:
pow(2, 3) => {key(2,3):8}
我想弄清楚的是如何获取该对的映射键(2,3)
,即生成一个由多个值组合而成的键并在哈希表中使用它的最佳方法。
解决方案
最简单、最灵活的方法是使用 astruct
作为键类型,包括您希望成为键一部分的所有数据,因此在您的情况下:
type Key struct {
X, Y int
}
就这样。使用它:
m := map[Key]int{}
m[Key{2, 2}] = 4
m[Key{2, 3}] = 8
fmt.Println("2^2 = ", m[Key{2, 2}])
fmt.Println("2^3 = ", m[Key{2, 3}])
输出(在Go Playground上试试):
2^2 = 4
2^3 = 8
规范:映射类型:您可以使用任何类型作为比较运算符==
和!=
完全定义的键,上述Key
结构类型满足了这一点。
规范:比较运算符:如果所有字段都可比较,则结构值是可比较的。如果它们对应的非空白字段相等,则两个结构值相等。
一件重要的事情:您不应该使用指针作为键类型(例如*Key
),因为比较指针只比较内存地址,而不是指向的值。
另请注意,您也可以使用数组(不是slices)作为键类型,但数组不如结构灵活。你可以在这里阅读更多相关信息:为什么在 Go 中有数组?
这就是数组的样子:
type Key [2]int
m := map[Key]int{}
m[Key{2, 2}] = 4
m[Key{2, 3}] = 8
fmt.Println("2^2 = ", m[Key{2, 2}])
fmt.Println("2^3 = ", m[Key{2, 3}])
输出是一样的。在Go Playground上尝试一下。