首页 > 解决方案 > 如何在go中为哈希映射制作复合键

问题描述

首先,我对复合键的定义 - 两个或多个值组合成键。不要与数据库中的复合键混淆。

我的目标是将计算值保存pow(x, y)在哈希表中,其中xy是整数。这就是我需要有关如何制作密钥的想法的地方,以便给定xy,我可以在哈希表中查找它,以找到pow(x,y).

例如:

pow(2, 3) => {key(2,3):8}

我想弄清楚的是如何获取该对的映射键(2,3),即生成一个由多个值组合而成的键并在哈希表中使用它的最佳方法。

标签: dictionarygohashmap

解决方案


最简单、最灵活的方法是使用 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上尝试一下。


推荐阅读