Runtime error: assignment to entry in nil map

MapGoYaml

Map 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

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionKasinath KottukkalView Question on Stackoverflow
Solution 1 - MapMakpocView Answer on Stackoverflow
Solution 2 - MapsharnoView Answer on Stackoverflow
Solution 3 - MapAman AgarwalView Answer on Stackoverflow
Solution 4 - MapHimanshuView Answer on Stackoverflow
Solution 5 - Mapdj1986View Answer on Stackoverflow