Go相当于Python的字典

Par*_*rag 7 go

我正在寻找一种使用 Go 为每个键存储多个值的方法(就像我们在 python 中使用字典一样)。Go 有没有办法实现这一点?

sbe*_*rry 8

根据您在评论中的回复,我建议使用以下结构(尽管如果您只对单个值感兴趣,例如name切片中的每个项目,那么您可以使用map[int][]string{}

type Thing struct {
    name string
    age  int
}

myMap := map[int][]Thing{}
Run Code Online (Sandbox Code Playgroud)

如果你想添加东西,那么你只需......

myMap[100] = append(myMap[100], Thing{"sberry": 37})
Run Code Online (Sandbox Code Playgroud)

或者,如果您想就地创建它:

myMap := map[int][]Thing{
        100: []Thing{Thing{"sberry", 37}},
        2:   []Thing{Thing{"johndoe", 22}},
    }
Run Code Online (Sandbox Code Playgroud)

编辑:根据注释添加“nameIn”函数作为演示:

func nameIn(things []Thing, name string) bool {
    for _, thing := range things {
        if thing.name == name {
            return true
        }
    }
    return false
}

if nameIn(myMap[100], "John") {
    ...
Run Code Online (Sandbox Code Playgroud)

如果切片确实很大并且速度很重要,那么您可以保留一个反向查找映射,就像map[string]int条目所在的位置一样John: 100,但是您很可能需要使用一些用户定义的函数来进行映射修改,以便它可以将反向查找更改为出色地。这也限制了您需要唯一的名称。

最有可能的是,它nameIn会工作得很好。


cap*_*aig 5

在 Go 中,键/值集合称为map. 你用它来创建它myMap := map[keyType]valType{}

通常类似于mapA := map[string]int{}. 如果您想为每个键存储多个值,可能类似于:

mapB := map[string][]string{}其中每个元素本身就是一个字符串切片。然后,您可以使用以下内容添加成员:

mapB["foo"] = append(mapB["foo"], "fizzbuzz")

如需精彩阅读,请参阅运行中的 Go 地图