【问题标题】:How can I write an array of maps [golang]如何编写地图数组 [golang]
【发布时间】:2014-05-28 19:21:14
【问题描述】:

我有一张地图,其值为一组地图。

例子:

 thisMap["coins"][0] = aMap["random":"something"]
 thisMap["notes"][1] = aMap["not-random":"something else"]
 thisMap["coins"][2] = aMap["not-random":"something else"]

我无法弄清楚如何做到这一点,因为go 在处理maps [name][value] = value 时似乎只允许在一个级别设置数据。

到目前为止,我的这段代码失败了

package main

func main() {

    something := []string{"coins", "notes", "gold?", "coins", "notes"}

    thisMap := make(map[string][]map[string]int)

    for k, v := range something {
        aMap := map[string]string{
            "random": "something",
        }

        thisMap[v] = [k]aMap
    }
}

编辑:切片值(“coins”、“notes”等)可以重复,所以这就是我需要使用索引 [] 的原因。

【问题讨论】:

  • 只是一个切线说明:从技术上讲,您使用的是一片地图,而不是一组地图。 blog.golang.org/slices

标签: arrays data-structures go


【解决方案1】:

工作示例 (click to play):

something := []string{"coins", "notes", "gold?"}

thisMap := make(map[string][]map[string]int)

for _, v := range something {
    aMap := map[string]int{
        "random": 12,
    }

    thisMap[v] = append(thisMap[v], aMap)
}

在迭代新创建的thisMap 时,您需要为新值aMap 腾出空间。使用切片时,内置函数 append 会为您执行此操作。它腾出空间并将值附加到切片。

如果您使用的数据类型更复杂,无法像切片那样轻松初始化,您首先必须检查键是否已经在映射中,如果没有,请初始化您的数据类型。检查地图元素记录在here。地图示例 (click to play):

thisMap := make(map[string]map[string]int)

for _, v := range something {
    if _, ok := thisMap[v]; !ok {
        thisMap[v] = make(map[string]int)
    }
    thisMap[v]["random"] = 12
}

【讨论】:

  • @Dustin:是的,在这种情况下,您确实不需要检查密钥。但是,我想保持更笼统的答案。
  • 一般来说,我永远不会制作零元素切片。在特殊情况下,我可能会使用文字。最好的做法是不要有超过正确解决问题所需的代码。
  • @Dustin:我的意思是,如果遇到类似问题的人偶然发现它,我的意思是尽可能保持答案的一般性。对于切片,您可以缩短代码,是的。例如,对于地图,您不能。这些必须被初始化,所以你需要进行密钥检查。我只是重新制定一些事情......
  • @nemo 如果切片具有重复值,这似乎不起作用。由于这个原因,我正在考虑使用 index/[] 。我应该先订购它们以避免丢失一些数据吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2012-03-12
  • 2014-06-30
  • 1970-01-01
相关资源
最近更新 更多