作者:枫叶 | 来源:互联网 | 2022-12-04 18:10
首先,我对复合键的定义 - 两个或多个值结合起来构成关键.不要混淆数据库中的复合键.
我的目标是在散列表中保存pow(x,y)的计算值(x和y是整数).这是我需要关于如何创建密钥的想法,所以给定x和y,我可以在哈希表中查找,找到pow(x,y).
例如.pow(2,3)=> {key(2,3):8}获取密钥(2,3)的功能/方式是我想弄清楚的.
一般来说,最好的方法是处理键,这是多个值的组合,同时在哈希表中用作键.
谢谢
1> icza..:
最简单,最灵活的方法是使用a struct
作为密钥类型,包括您希望成为密钥一部分的所有数据,因此在您的情况下:
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
),因为比较指针只比较内存地址,而不是指向的值.
另请注意,您也可以使用数组(而不是切片)作为键类型,但数组不像结构一样灵活.你可以在这里阅读更多相关内容:为什么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尝试一下.