233 字
1 分钟
可以边遍历边删除吗 - 数据结构
map 并不是一个线程安全的数据结构。同时读写一个 map 是未定义的行为,如果被检测到,会直接 panic。
上面说的是发生在多个协程同时读写同一个 map 的情况下。 如果在同一个协程内边遍历边删除,并不会检测到同时读写,理论上是可以这样做的。但是,遍历的结果就可能不会是相同的了,有可能结果遍历结果集中包含了删除的 key,也有可能不包含,这取决于删除 key 的时间:是在遍历到 key 所在的 bucket 时刻前或者后。
一般而言,这可以通过读写锁来解决:sync.RWMutex。
读之前调用 RLock() 函数,读完之后调用 RUnlock() 函数解锁;写之前调用 Lock() 函数,写完之后,调用 Unlock() 解锁。
另外,sync.Map 是线程安全的 map,也可以使用。
相关阅读
本主题其他内容
Go 基础与进阶
本主题共 120 篇 ·
Go 语言 专题 →
Go 语言从入门到进阶:基础语法与工程惯例、标准库常用包、错误处理与并发模式、Web 开发与微服务框架入门,帮助新手建立可持续演进的 Go 代码习惯。