使用数组作为键的哈希表

3
如何在Go中创建一个作为映射键的数组。 例如,在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个回答

8
Go中的数组类型(与切片不同)是可比较的,因此并没有什么神奇的地方:您可以像任何其他映射一样定义它:map[KeyType]ValueType,其中KeyType将是[3]int,而ValueType将是string。 需要注意的是,在Go语言中,对于键类型,比较运算符==和!=必须被完全定义;因此,键类型不能是函数、映射或切片。
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
需要注意的是,Ruby中的array和Go中的array是不同的数据结构。Go中的数组是不可变的,而Ruby中的array是可变的。Go中的slice更类似于Ruby中的array。然而,在Go中不能使用slices作为键,正如icza的回答所指出的那样。
因此,回答你的问题:

在Golang中会是怎样的呢?

这是不可能的,在Go中你无法将动态数组映射到字符串的字典中。但是,你可以将slices转换为arrays并将它们用作键,正如icza所解释的那样。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接