Back

go - 奇怪的map 数组无法赋值的问题:元素没有被初始化 panic: assignment to entry in nil map

发布时间: 2023-11-02 23:05:00

refer to:

这样的代码:

package main

import "fmt"

func main() {
  a := make(map[string]interface{})
  if a["year"] == nil {
    a["year"] = 2002
    a["value"] = 100
  }else{
    fmt.Println(" in else")
  }

  fmt.Println(a)

  b := make([]map[string]interface{}, 2)
  b[0]["year"] = 2001
  b[0]["value"] = "200"
  fmt.Println(b)
}                  

结果为:

 go run test3.go
map[value:100 year:2002]
panic: assignment to entry in nil map

goroutine 1 [running]:
main.main()
        /home/xx/test3.go:17 +0x199
exit status 2

可以看出,如果对于某个map (slice), 可以直接用[] 方法,但是对于 []Map 这样的结构,则无法直接赋值。

原因:

因为该slice ( b )被初始化的时候,只是初始化了最外层的slice 结构(或者说是一个动态的array),而slice里面的元素没有被初始化( interface{} ) ,所以是一个nil 

nil对象自然就没有 Set["key"] 这样的方法了。

解决办法;

  b := make([]map[string]interface{}, 2)
  b[0] = make(map[string]interface{})
  b[0]["year"] = 2001
  b[0]["value"] = "200"

Back