码农桃花源
GitHub
知乎
掘金
博客园
Search…
码农桃花源
README
channel
map
map 的底层实现原理是什么
可以边遍历边删除吗
map 的删除过程是怎样的
可以对 map 的元素取地址吗
如何比较两个 map 相等
如何实现两种 get 操作
map 是线程安全的吗
map 的遍历过程是怎样的
map 中的 key 为什么是无序的
float 类型可以作为 map 的 key 吗
map 的赋值过程是怎样的
map 的扩容过程是怎样的
interface
标准库
goroutine 调度器
编译和链接
反射
数组和切片
GC
Powered By
GitBook
可以边遍历边删除吗
map 并不是一个线程安全的数据结构。同时读写一个 map 是未定义的行为,如果被检测到,会直接 panic。
上面说的是发生在多个协程同时读写同一个 map 的情况下。 如果在同一个协程内边遍历边删除,并不会检测到同时读写,理论上是可以这样做的。但是,遍历的结果就可能不会是相同的了,有可能结果遍历结果集中包含了删除的 key,也有可能不包含,这取决于删除 key 的时间:是在遍历到 key 所在的 bucket 时刻前或者后。
一般而言,这可以通过读写锁来解决:
sync.RWMutex
。
读之前调用
RLock()
函数,读完之后调用
RUnlock()
函数解锁;写之前调用
Lock()
函数,写完之后,调用
Unlock()
解锁。
另外,
sync.Map
是线程安全的 map,也可以使用。
Previous
map 的底层实现原理是什么
Next
map 的删除过程是怎样的
Last modified
2yr ago
Copy link