将数据添加到map [string] interface {}

时间:2017-12-20 19:20:54

标签: go

我有以下代码:

package main

import (
    "sync"
    "fmt"
)

var dataSet = struct {
    sync.RWMutex
    data map[string]interface{}
}{data: make(map[string]interface{})}

func main() {
    dataSet.Lock()
    defer dataSet.Unlock()
    d := dataSet.data

    test := []string{"one", "two", "three"}
    m := map[string]int{
        "one":   1,
        "two":   2,
        "three": 3,
    }
    for _, t := range test {
        d["data"] = map[string]interface{}{
            "test" : m["one"],
            "more": 1,
            t: map[string]int{
                "lvl2": 2,
            },
        }
    }
    fmt.Println(dataSet.data["data"])
}

这可能吗?

感谢您的帮助,我更新了上述代码。 我对golang很新,其中一些嵌套地图令人困惑。

fmt.Println(dataSet.data["data"])

返回

map[test:1 more:1 three:map[lvl2:2]]

如何让它成为所有3张地图?

fmt.Println(dataSet.data["data"].(map[string]interface{})["three"]

返回

map[lvl2:2]

fmt.Println(dataSet.data["data"].(map[string]interface{})["three"]

返回

<nil>

如何附加测试中的所有项目?

谢谢大家!

最终解决方案:https://play.golang.org/p/bRZXye649fY

package main

import (
    "fmt"
    "sync"
)

var dataSet = struct {
    sync.RWMutex
    data map[string]interface{}
}{data: make(map[string]interface{})}

func main() {
    dataSet.Lock()
    defer dataSet.Unlock()
    d := dataSet.data

    test := []string{"one", "two", "three"}
    m := map[string]int{
        "one":   1,
        "two":   2,
        "three": 3,
    }

    for i, t := range test {

        dt := map[string]interface{}{
            "test": m["one"],
            "more": 1,
            t: map[string]interface{}{
                "i": i,
            },
        }

        // If not set, just use it
        if d["data"] == nil {
            d["data"] = dt
            continue
        }

        // Otherwise we want to merge new data in
        dm := d["data"].(map[string]interface{})
        for k, v := range dt {
            dm[k] = v
        }

    }
    fmt.Println(dataSet.data["data"].(map[string]interface{})["two"])
    fmt.Println(dataSet.data["data"])
}

1 个答案:

答案 0 :(得分:1)

您的问题并不清楚您尝试插入哪种数据类型(地图值为interface{},这可能是字面上的任何内容),但这里猜测是什么你的目标可能是:

for _, t := range test {
    d["data"] = map[string]interface{}{
        "test" + t: m["one"],
        "more": 1,
        "t": map[string]int{
            "lvl2": 2,
        },
    }
}

基本上,在指定复合文字时,需要指定其类型,并且在多行文字中,每一行都需要以逗号结尾。请参阅the tourthe spec