You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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
}
}
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)
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.
The text was updated successfully, but these errors were encountered:
golang中map是引用类型,应用类型的变量未初始化时默认的zero value是nil。直接向nil map写入键值数据会导致运行时错误
panic: assignment to entry in nil map
看一个例子:
运行这段程序会出现运行时从错误:
因为在声明
alphabetMap
后并未初始化它,所以它的值是nil, 不指向任何内存地址。需要通过make
方法分配确定的内存地址。程序修改后即可正常运行:关于这个问题官方文档中解释如下:
同为引用类型的slice,在使用
append
向nil slice追加新元素就可以,原因是append
方法在底层为slice重新分配了相关数组让nil slice指向了具体的内存地址The text was updated successfully, but these errors were encountered: