Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

不要向nil map写入(panic: assignment to entry in nil map) #7

Open
kevinyan815 opened this issue Aug 4, 2019 · 2 comments
Open

Comments

@kevinyan815
Copy link
Owner

kevinyan815 commented Aug 4, 2019

golang中map是引用类型,应用类型的变量未初始化时默认的zero value是nil。直接向nil map写入键值数据会导致运行时错误panic: assignment to entry in nil map

看一个例子:

package main
const alphabetStr string = "abcdefghijklmnopqrstuvwxyz"
func main() {
  var alphabetMap map[string]bool
  for _, r := range alphabetStr {
    c := string(r)
    alphabetMap[c] = true
  }
}

运行这段程序会出现运行时从错误:

panic: assignment to entry in nil map

因为在声明alphabetMap后并未初始化它,所以它的值是nil, 不指向任何内存地址。需要通过make方法分配确定的内存地址。程序修改后即可正常运行:

package main
import "fmt"
const alphabetStr string = "abcdefghijklmnopqrstuvwxyz"
func main() {
  alphabetMap := make(map[string]bool)
  for _, r := range alphabetStr {
    c := string(r)
    alphabetMap[c] = true
  }
  fmt.Println(alphabetMap["x"])
  alphabetMap["x"] = false
  fmt.Println(alphabetMap["x"])
}

关于这个问题官方文档中解释如下:

This variable m is a map of string keys to int values:
var m map[string]int
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. To initialize a map, use the built in make function:
m = make(map[string]int)

同为引用类型的slice,在使用append 向nil slice追加新元素就可以,原因是append方法在底层为slice重新分配了相关数组让nil slice指向了具体的内存地址

nil map doesn't point to an initialized map. Assigning value won't reallocate point address.
The append function appends the elements x to the end of the slice s, If the backing array of s is too small to fit all the given values a bigger array will be allocated. The returned slice will point to the newly allocated array.

@fanyingjie11
Copy link

解答了我的疑惑,thanks

@kevinyan815
Copy link
Owner Author

解答了我的疑惑,thanks

不客气,很高兴这里的内容能有帮助

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants