Runtime error: assignment to entry in nil map
MapGoYamlMap Problem Overview
I am trying to generate a map and then convert that to a yaml file like this:
uid :
kasi:
cn: Chaithra
street: fkmp
nandan:
cn: Chaithra
street: fkmp
remya:
cn: Chaithra
street: fkmp
I think I am missing something important while creating the map. My code is below.
package main
import (
"fmt"
"gopkg.in/yaml.v2"
)
type T struct {
cn string
street string
}
func main() {
names := []string{"kasi", "remya", "nandan"}
m := make(map[string]map[string]T, len(names))
for _, name := range names {
//t := T{cn: "Chaithra", street: "fkmp"}
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
}
fmt.Println(m)
y, _ := yaml.Marshal(&m)
fmt.Println(string(y))
//fmt.Println(m, names)
}
It is giving the following error:
panic: runtime error: assignment to entry in nil map
Map Solutions
Solution 1 - Map
You have not initialized your inner map. Before your for loop you can add m["uid"] = make(map[string]T)
and then assign the name.
Solution 2 - Map
You should check if the map is nil and initialize one if it's nil inside the for loop:
if m["uid"] == nil {
m["uid"] = map[string]T{}
}
Solution 3 - Map
Probably the map you have define is by using variable
var m map[string]interface{}
Instead use
m := make(map[string]interface{})
to avoid respective error
Solution 4 - Map
There is thing as per the error
assignment to entry in nil map
For nested maps when assign to the deep level key we needs to be certain that its outer key has value. Else it will say that the map is nil. For eg in your case
m := make(map[string]map[string]T, len(names))
m is a nested map which contains string
key with map[string]T
as value. And you are assign the value
m["uid"][name] = T{cn: "Chaithra", street: "fkmp"}
here you can see the m["uid"]
is nil
and we are stating it contains a value [name]
which is a key to nested value of type T
. So first you need to assign value to "uid" or initialise it as
m["uid"] = make(map[string]T)
Solution 5 - Map
@Makpoc already answered the question. just adding some extra info.
> Map types are reference types, like pointers or slices, and so the value of m above is nil; it doesn't point to an initialized map. A nil map behaves like an empty map when reading, but attempts to write to a nil map will cause a runtime panic; don't do that. more info about Map