sync.Map
概念说明
普通 map 不支持并发读写。
如果多个 goroutine 同时读写普通 map,可能出现数据竞争,严重时会直接触发运行时错误。
sync.Map 是标准库提供的并发安全 map。
它适合读多写少、键集合相对稳定等场景。
语法/规则
- 使用
Store(key, value)写入数据。 - 使用
Load(key)读取数据,返回value, ok。 - 使用
Delete(key)删除数据。 - 使用
Range(func(key, value any) bool)遍历数据。 Range返回false表示停止遍历。- 如果需要强类型和复杂一致性,普通 map 加锁可能更清晰。
sync.Map 示例
| |
输出结果(遍历顺序可能不同):
| |
常见错误
- 并发读写普通 map,可能触发
fatal error: concurrent map writes。 - 忘记
Load返回的是any,使用具体类型前需要断言。 - 以为
Range遍历顺序固定,实际不要依赖顺序。 - 在所有场景都使用
sync.Map,忽略普通 map 加锁可能更简单。