When exploring nested maps in Golang, a series of code examples reveal apparent discrepancies:
func main() { var data = map[string]string{} data["a"] = "x" data["b"] = "x" data["c"] = "x" fmt.Println(data) }
This code runs successfully.
func main() { var data = map[string][]string{} data["a"] = append(data["a"], "x") data["b"] = append(data["b"], "x") data["c"] = append(data["c"], "x") fmt.Println(data) }
You can also do this.
func main() { var w = map[string]string{} var data = map[string]map[string]string{} w["w"] = "x" data["a"] = w data["b"] = w data["c"] = w fmt.Println(data) }
This can also be done.
However, when I run the code below I get an error.
func main() { var data = map[string]map[string]string{} data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data) }
There's a problem.
The cause of this problem is that the zero value of the map type is nil. Zero value is uninitialized. You cannot store values in a nil map. This is a runtime panic.
In the last example, we initialized the (external) data map, but there are no entries. If you index like data["a"], there is no entry for the "a" key yet, so the indexing returns a zero value with a value type of nil. Therefore, if you try to assign to data"a", a runtime panic will occur.
The map must be initialized before storing any elements. For example:
var data = map[string]map[string]string{} data["a"] = map[string]string{} data["b"] = make(map[string]string) data["c"] = make(map[string]string) data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
Output (Try it in Go Playground):
map[a:map[w:x] b:map[w:x] c:map[w:x]]
If you declare and initialize a variable map type using a compound literal, that is also considered an initialization. Masu.
var data = map[string]map[string]string{ "a": map[string]string{}, "b": map[string]string{}, "c": map[string]string{}, } data["a"]["w"] = "x" data["b"]["w"] = "x" data["c"]["w"] = "x" fmt.Println(data)
The output is the same. Try it at Go Playground.
The above is the detailed content of Why Do Nested Maps in Go Cause Runtime Panics When Accessed Directly, But Not When Using Append or Initialization?. For more information, please follow other related articles on the PHP Chinese website!