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尝试一下.
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)
我希望有帮助