【Go】fatal error: concurrent map writes 问题记录

205 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

问题起因:我使用协程,函数内对map读写

一、问题代码

//全局变量 
var map map[string]string

	assign := averageAssign(dataTree, 3)
	var wg sync.WaitGroup
	wg.Add(3)
	for i, _ := range assign {
		go handle(assign[i], i, &wg)
	}
	wg.Wait()

func handle(epsTree []model.Xx, i int, wg *sync.WaitGroup) {
   defer wg.Done()
   xx:=map[xx]
   map[xx]=xx
}

二、修复

①声明结构体

type UMap struct { 
sync.RWMutex Map map[string]string 
}
var map *UMap

②声明map读写函数

//读
func (l *UMap) readMap(key string) (string, bool) {
	l.RLock()
	value, ok := l.Map[key]
	l.RUnlock()
	return value, ok
}
//写
func (l *UMap) writeMap(key string, value string) {
	l.Lock()
	l.Map[key] = value
	l.Unlock()
}

③使用安全读写

....
//读
value, _ := map.readMap(key)
//写
map.writeMap(key, value)