Golang 1.8 中的并发映射迭代和映射写入错误

5
所以我有这个函数...
func Set(firstSet map[string][]App, store map[string]*Parsed) map[string][string]struct{} {
    s := make(map[string]map[string]struct{})
    for dmn, parsed := range store {
        for cId, apps := range firstSet {
            if _, ok := s[dmn]; !ok {
                s[dmn] = make(map[string]struct{})
            }
            s[dmn][cId] = struct{}{}
        }
    }

    return s
}

那个函数的第三行(for dmn, parsed := range store)在 Golang 1.8 中给我报了并发 map 迭代和 map 写入错误。你有什么想法吗?

2个回答

5

看起来像是并发地图误用。可能你的函数从不同的 Goroutine 调用。尝试使用 mutex.Lock()/Unlock() 将函数体包裹起来,以使你的映射在并发使用时安全。


2
在Golang 1.8中添加了增强的并发访问检查,以下是runtime/hashmap.go:736的源代码。
if h.flags&hashWriting != 0 {
    throw("concurrent map iteration and map write")
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接