Runtime error: assignment to entry in nil map

117,995

Solution 1

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

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

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

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)
Share:
117,995
Kasinath Kottukkal
Author by

Kasinath Kottukkal

Updated on May 22, 2021

Comments

  • Kasinath Kottukkal
    Kasinath Kottukkal about 3 years

    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
    
  • Nic
    Nic about 3 years
    m is not nil, it is m["uid"] that is nil