我在一段时间后写的一些旧代码上看到“致命错误:并发映射迭代和映射写”。我一直在尝试诊断问题,并且遇到了类似于下面的游乐场链接的代码块。
即使返回的带锁函数返回的地图(通过引用传递)对我来说似乎也是错误的。
我一直在寻找一个解释,为什么这似乎没有引发上述错误。
我知道现在有RWMutex和同步地图,但是这段代码是前一段时间编写的,我正在寻找有关功能而不是改进的解释。
https://play.golang.org/p/_RY-QAyGE2W
我认为上面的代码将引发“致命错误:并发映射迭代和映射写入”,但是似乎没有任何问题。
答案 0 :(得分:0)
这可以更好地说明问题:https://play.golang.org/p/RiWTxBoNqwD 它不会在操场上运行,但是如果您从命令行运行它,它将立即崩溃。
地图的迭代不受互斥锁的保护。只有返回地图参考的行为受到保护。
这几乎相同,但是整个迭代受到互斥锁https://play.golang.org/p/cQNs3x_k-SL或此https://play.golang.org/p/ydjprgvF6aE
的保护。