使用键作为数组类型的哈希值

时间:2015-03-20 20:25:06

标签: arrays dictionary go

如何在Go for map中创建一个数组作为数组。 例如在ruby中我可以实现它:

quarters = {
  [1, 2, 3] => 'First quarter',
  [4, 5, 6] => 'Second quarter',
  [7, 8 ,9] => 'Third quarter',
  [10, 11, 12] => 'Fourh quarter',
}
quarters[[1, 2, 3]] 
# => "First quarter"

在Golang中如何看待它?

2 个答案:

答案 0 :(得分:8)

Go中的数组类型(与切片不同)具有可比性,因此没有什么神奇之处:您可以像任何其他地图一样定义它:map[KeyType]ValueType其中KeyType将是[3]int ValueType将为string

  

必须为密钥类型的操作数完全定义comparison operators ==和!=;因此,键类型不能是函数,映射或切片。

m := map[[3]int]string{}

m[[3]int{1, 2, 3}] = "First quarter"
m[[3]int{4, 5, 6}] = "Second quarter"
m[[3]int{7, 8, 9}] = "Third quarter"
m[[3]int{10, 11, 12}] = "Fourth quarter"

fmt.Println(m)

输出:

map[[1 2 3]:First quarter [4 5 6]:Second quarter 
    [7 8 9]:Third quarter [10 11 12]:Fourth quarter]

Go Playground上尝试。

查询元素:

fmt.Println(m[[3]int{1, 2, 3}]) // Prints "First quarter"

您还可以一步创建地图:

m := map[[3]int]string{
    [3]int{1, 2, 3}:    "First quarter",
    [3]int{4, 5, 6}:    "Second quarter",
    [3]int{7, 8, 9}:    "Third quarter",
    [3]int{10, 11, 12}: "Fourth quarter",
}

答案 1 :(得分:1)

应该注意的是,ruby中的array和go中的array是不同的数据结构。 Go数组不可变,而ruby array是。 Go slice与ruby array的数据结构更相似。但是,正如icza的回答所指出的那样,你不能使用slices作为关键。

所以回答你的问题:

  

在Golang中如何看待它?

这是不可能的,你不能拥有一个将dynamic arrays映射到strings的字典。但是,您可以将slices转换为arrays并将其用作密钥,icza将对其进行详细解释。