Dictionary 如何在golang中为哈希映射生成复合密钥

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不能把一片整数弄乱 因此,我处理这个问题的方法是将一个结构映射到一个数

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

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

例如,pow(2,3)=>{key(2,3):8} 获取键(2,3)的函数/方法是我想要了解的

一般来说,当用作哈希表中的键时,处理由多个值组合而成的键的最佳方法是什么


谢谢

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}])