【问题标题】:How can I append items to the map in range? [closed]如何将项目附加到范围内的地图? [关闭]
【发布时间】:2018-09-07 13:48:47
【问题描述】:

例子:

package main

import (
    "encoding/json"
    "fmt"
    "github.com/imdario/mergo"
)

func main() {
    var DATA []map[string]interface{}
    text := []byte(`[{"id":1,"test":1},{"id":2},{"id":3,"test":3},{"test":8}]`)
    err := json.Unmarshal(text, &DATA)
    if err != nil {
        fmt.Errorf("ERR: %s", err)
    }

    var STATE map[string]interface{}
    var newState []interface{}

    fmt.Println("DATA: ", DATA)

    for _, k := range DATA {
        if err := mergo.Merge(&STATE, k, mergo.WithOverride); err != nil {
            fmt.Errorf("Error merge new and old packets: %s", err)
        }
        fmt.Println("STATE: ", STATE)

        newState = append(newState, STATE)
    }

    fmt.Println(newState)

}

我得到:[map[id:3 test:8] map[test:8 id:3] map[id:3 test:8] map[test:8 id:3]]
我想得到 [map[id:1 test:1] map[test:2 id:1] map[id:3 test:3] map[test:8 id:3]]

我不明白为什么最后一个值落入数据片中,而不是在撰写本文时

【问题讨论】:

  • 地图是无序的。所以没有办法保证你会得到你想要的。
  • 我不明白你想在这里实现什么。预期的输出与输入完全相同,那么为什么不只是fmt.Println(DATA)
  • @Peter 我更新了示例

标签: go


【解决方案1】:

我意识到问题出在哪里,我需要显式复制每个值

for key,value := range STATE {
    newState[i][key] = value
}

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 2017-07-15
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    相关资源
    最近更新 更多