最近研究golang,用上了map(map类似PHP数组的 KEY=>VALUE,C#,python,java的字典)和goroutine,刚开始没报错运行自我感觉良好。

将goroutine数量增加后发生问题,报错:

fatal error: concurrent map read and map write

百度查询后发现go语言中map不是线程安全的,同时读写就会出现问题。

所以加个sync.RWMutex就可以了。

type SecureMapAndLock struct {
   sync.RWMutex
   item map[string]interface{}
}

使用的时候:

//写入的时候用Lock()和Unlock()
secureMap := new(SecureMapAndLock)
secureMap.Lock()
secureMap.item = map[string]interface{}{"name": "小枫泡泡"}
secureMap.Unlock()

//读取的时候用RLock()和RUnlock()
secureMap.RLock()
name := secureMap.item["name"]
secureMap.RUnlock()

这样错误就能解决了。


参考资料:

https://blog.csdn.net/simatongming/article/details/79075820

https://www.jianshu.com/p/10a998089486

https://segmentfault.com/a/1190000010294041