How to add data to a map of maps in Golang?

Viewed 21870

I am learning to use the map of maps. In the following example, there are three nested maps.

package main

import (
    "fmt"
)

func main() {

    var data = map[string]map[string]map[string]string{}

    data["Date_1"] = map[string]map[string]string{}
    data["Date_1"] = make(map[string]map[string]string, 1)
    data["Date_1"] = make(map[string]map[string]string, 0)

    data["Date_1"]["Sistem_A"] = map[string]string{}
    data["Date_1"]["Sistem_A"] = make(map[string]string, 0)
    data["Date_1"]["Sistem_A"] = make(map[string]string, 0)

    data["Date_1"]["Sistem_A"]["command_1"] = "white"
    data["Date_1"]["Sistem_A"]["command_2"] = "blue"
    data["Date_1"]["Sistem_A"]["command_3"] = "red"

    fmt.Println("data: ", data)
}

Output

data:  map[Date_1:map[Sistem_A:map[command_1:white command_2:blue command_3:red]]]

The problem is that if I want to add the values ​​in one step I get a panic: assignment to entry in nil map.

package main

import (
    "fmt"
)

func main() {

    var data = map[string]map[string]map[string]string{}

    data["Date_1"] = map[string]map[string]string{}
    data["Date_1"] = make(map[string]map[string]string, 0)
    data["Date_1"] = make(map[string]map[string]string, 0)

    data["Date_1"]["Sistem_A"] = map[string]string{}
    data["Date_1"]["Sistem_A"] = make(map[string]string, 0)
    data["Date_1"]["Sistem_A"] = make(map[string]string, 0)

    data["Date_1"]["Sistem_A"]["command_1"] = "white"
    data["Date_1"]["Sistem_A"]["command_2"] = "blue"
    data["Date_1"]["Sistem_A"]["command_3"] = "red"

    data["Date_2"]["Sistem_A"]["command_5"] = "violet"

    fmt.Println("data: ", data)
}

Output

panic: assignment to entry in nil map

There is very little guidance information at this point. Could you help me?

Thank you.

2 Answers

It is here:

    data["Date_2"]["Sistem_A"]["command_5"] = "violet"

The expression data["Date_2"] will return a nil-map. It is never initialized, so looking for the index ["Sistem_A"] panics. Initialize the map first:

    data["Date_2"] = make(map[string]map[string]string)
    data["Date_2"]["Sistem_A"] = make(map[string]string)
    data["Date_2"]["Sistem_A"]["command_5"] = "violet"

Your problem is, that you never initialized data["Date_2"] (so it is nil).

So by doing data["Date_2"]["Sistem_A"]["command_5"] = "violet", looking for the index panics.

you have to initialize first as follows:

data["Date_2"]=make(map[string]map[string]string)
data["Date_2"]["Sistem_A"]=make(map[string]string)
Related