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

I have the following code:

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"])
}

Is this possible?

Thanks for the help, I updated the above code. I'm rather new to golang and some of these nested maps are confusing.

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

returns

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

How do I get it to be all 3 maps?

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

returns

map[lvl2:2]

but

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

returns

<nil>

How do I have all the items in test appended?


Thanks everyone!

Final solution: 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"])
}

It's not clear from your question what data type you're trying to insert (the map values are interface{} which can be literally anything), but here's a guess at what you might be aiming for:

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

Basically when specifying a composite literal, you need to specify its type, and in a multi-line literal, each line needs to end in a comma. See the tour and the spec.