在Go例程中迭代地图?

时间:2019-02-07 20:12:46

标签: go

我在一段时间后写的一些旧代码上看到“致命错误:并发映射迭代和映射写”。我一直在尝试诊断问题,并且遇到了类似于下面的游乐场链接的代码块。

即使返回的带锁函数返回的地图(通过引用传递)对我来说似乎也是错误的。

我一直在寻找一个解释,为什么这似乎没有引发上述错误。

我知道现在有RWMutex和同步地图,但是这段代码是前一段时间编写的,我正在寻找有关功能而不是改进的解释。

https://play.golang.org/p/_RY-QAyGE2W

我认为上面的代码将引发“致命错误:并发映射迭代和映射写入”,但是似乎没有任何问题。

1 个答案:

答案 0 :(得分:0)

这可以更好地说明问题:https://play.golang.org/p/RiWTxBoNqwD 它不会在操场上运行,但是如果您从命令行运行它,它将立即崩溃。

地图的迭代不受互斥锁的保护。只有返回地图参考的行为受到保护。

这几乎相同,但是整个迭代受到互斥锁https://play.golang.org/p/cQNs3x_k-SL或此https://play.golang.org/p/ydjprgvF6aE

的保护。