← 返回首页

Go中 Map可以边遍历边删除吗

map 并不是一个线程安全的数据结构。如果多个线程边遍历,边删除,同时读写一个 map 是未定义的行为,如果被检测到,会直接 panic。

如果是发生在多个协程同时读写同一个 map 的情况下。

如果在同一个协程内边遍历边删除,并不会检测到同时读写,理论上是可以这样做的。

但是,遍历的结果就可能不会是相同的了,有可能结果遍历结果集中包含了删除的 key,也有可能不包含,这取决于删除 key 的时间:是在遍历到 key 所在的 bucket 时刻前或者后。

这种情况下,可以通过加读写锁sync.RWMutex来保证。