Dictionary 如何在golang中为哈希映射生成复合密钥
首先,我对复合键的定义——两个或更多的值组合成键。不要与数据库中的复合键混淆 我的目标是将pow(x,y)的计算值保存在哈希表中(x和y是整数)。这就是我需要关于如何制作密钥的想法的地方,这样给定x和y,我可以在哈希表中查找它,以找到pow(x,y) 例如,pow(2,3)=>{key(2,3):8} 获取键(2,3)的函数/方法是我想要了解的 一般来说,当用作哈希表中的键时,处理由多个值组合而成的键的最佳方法是什么Dictionary 如何在golang中为哈希映射生成复合密钥,dictionary,go,hashmap,Dictionary,Go,Hashmap,首先,我对复合键的定义——两个或更多的值组合成键。不要与数据库中的复合键混淆 我的目标是将pow(x,y)的计算值保存在哈希表中(x和y是整数)。这就是我需要关于如何制作密钥的想法的地方,这样给定x和y,我可以在哈希表中查找它,以找到pow(x,y) 例如,pow(2,3)=>{key(2,3):8} 获取键(2,3)的函数/方法是我想要了解的 一般来说,当用作哈希表中的键时,处理由多个值组合而成的键的最佳方法是什么 谢谢Go不能把一片整数弄乱 因此,我处理这个问题的方法是将一个结构映射到一个数
谢谢Go不能把一片整数弄乱 因此,我处理这个问题的方法是将一个结构映射到一个数字 下面是一个如何做到这一点的示例:
package main
import (
"fmt"
)
type Nums struct {
num1 int
num2 int
}
func main() {
powers := make(map[Nums]int)
numbers := Nums{num1: 2, num2: 4}
powers[numbers] = 6
fmt.Printf("%v", powers[input])
}
我希望这有帮助最简单、最灵活的方法是使用
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}])
输出(在上尝试):
您可以使用任何类型作为键,其中比较运算符==
和=代码>是完全定义的,上面的键
结构类型实现了这一点
如果结构值的所有字段都具有可比性,则结构值具有可比性。如果两个结构值对应的非字段相等,则两个结构值相等
有一点很重要:您不应该使用指针作为键类型(例如,*key
),因为比较指针只比较内存地址,而不比较指向的值
还请注意,您也可以将(not)用作键类型,但数组不如结构灵活。您可以在此处阅读更多关于此的信息:
这是阵列的外观:
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}])
输出是相同的。在上尝试。您可以创建一个类型,为其创建值以分配地图<代码>键入myKey结构{x,y int};m:=map[myKey]int{myKey{2,3}:8,};//代码>答案的第一句说切片(数组)不能用作键。切片和数组不是一回事。数组可以用作映射键。@ThunderCat I不知道数组可以用作映射键。为此进行了编辑。谢谢总是用slice之类的短语问我自己,因为我担心使用一些go特定的术语,答案会变得不那么容易理解。@GauravSinha顺便说一句,如果你想避免调用中的关键文本,你可以使用一个方法将映射命名为命名类型:@Kaedys nice,这更干净。非常感谢。
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}])