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.