初始化后再使用
Golang中,map是引用类型,如切片一样,通过下面的代码声明后指向的是nil,所以千万别直接声明后就使用,新手可能经常会犯如下错误:
var m map[string]string
m["result"] = "result"
由于字典是引用类型,所以当我们仅声明而不初始化一个字典类型的变量的时候,他的值是nil。对值为nil的字段除添加键值对外其他操作都不会引发错误。上面的第一行代码对其进行写入操作,就是对空指针的引用,这将会造成一个painc。所以,得记得用 make函数对其进行分配内存和初始化:
m := make(map[string]string)
并发安全
并发安全也叫线程安全,在并发中出现了数据的丢失,称为并发不安全我们都知道非原子操作的都不是并发安全的,在Golang中map,其读写操作并不保证并发安全。如下面的操作
c := make(map[string]string)
wg := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wg.Add(1)
go func(n int) {
k, v := strconv.Itoa(n), strconv.Itoa(n)
c[k] = v
wg.Done()
}(i)
}
wg.Wait()
fmt.Println(c)
运行则会出现下面的错误
fa