Golang Map怎么并发访问
Map 是每门编程语言的最基础的数据结构,这种数据结构的实现就是 key-value之间的映射关系,每个key都有一个唯一的索引值,通过索引值可以很快的找到对应的值。
Map 也是程序中最常见的数据结构,我们的项目中有大量的数据需要加载到内存中,而且需要高频访问,无疑 map 就是最好的选择,但是众所周知,Map是不支持并发访问的。
如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 func main() { var m = make(map[string]int,10) // 初始化一个map go func() { for { m["abc"] = 1 //设置key } }() go func() { for { _ = m["def"] //访问这个map } }() select {} } 虽然这段代码的不同goroutine 是各自在操作不同的元素,但是运行时检测到同时对 map 对象有并发访问,就会直接 panic。
Go语言原生的map类型在并发读写时会导致panic,这是Go设计团队在权衡性能和安全性后的决定。当多个goroutine同时执行写操作,或同时进行读写操作时,会触发并发检测机制导致程序崩溃。错误示例如下: