如何在golang中为哈希映射创建复合键

Gau*_*nha 4 dictionary hashmap go

首先,我对复合键的定义 - 两个或多个值结合起来构成关键.不要混淆数据库中的复合键.

我的目标是在散列表中保存pow(x,y)的计算值(x和y是整数).这是我需要关于如何创建密钥的想法,所以给定x和y,我可以在哈希表中查找,找到pow(x,y).

例如.pow(2,3)=> {key(2,3):8}获取密钥(2,3)的功能/方式是我想弄清楚的.

一般来说,最好的方法是处理键,这是多个值的组合,同时在哈希表中用作键.

谢谢

icz*_*cza 11

最简单,最灵活的方法是使用a struct作为密钥类型,包括您希望成为密钥一部分的所有数据,因此在您的情况下:

type Key struct {
    X, Y int
}
Run Code Online (Sandbox Code Playgroud)

就这样.使用它:

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}])
Run Code Online (Sandbox Code Playgroud)

输出(在Go Playground上试试):

2^2 =  4
2^3 =  8
Run Code Online (Sandbox Code Playgroud)

规范:地图类型:您可以使用任何类型作为比较运算符==!=完全定义的键,上面的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}])
Run Code Online (Sandbox Code Playgroud)

输出是一样的.在Go Playground尝试一下.


Dea*_*ley 7

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])
}
Run Code Online (Sandbox Code Playgroud)

我希望有帮助