Go 的 sync 包提供了一些并发安全的数据结构,其中包括 sync.Map{}。该结构是一个并发安全的哈希表,具有以下特点:
- 读取和写入操作都是并发安全的,不需要加锁。
- 在多个 goroutine 进行并发写入时,插入顺序和读取顺序不一定相同。
- 在多个 goroutine 进行并发写入和读取时,保证每个键值对的最终结果是正确的。
sync.Map{} 的使用场景包括:
- 并发访问一个全局的哈希表。
- 在多个 goroutine 中共享一个缓存。
下面是 sync.Map{} 的代码示例:
package main
import (
"fmt"
"sync"
)
func main() {
var m sync.Map
// 添加键值对
m.Store("A", 1)
m.Store("B", 2)
m.Store("C", 3)
// 读取键值对
v, ok := m.Load("A")
if ok {
fmt.Println("A:", v)
}
// 删除键值对
m.Delete("B")
// 遍历所有键值对
m.Range(func(k, v interface{}) bool {
fmt.Println(k, v)
return true
})
}
上面的代码首先创建一个新的 sync.Map{},然后使用 Store() 方法添加三个键值对。接着使用 Load() 方法读取键 "A" 对应的值,并判断该键是否存在。然后使用 Delete() 方法删除键 "B"。最后使用 Range() 方法遍历所有的键值对,并打印出来。
以上示例代码中,所有的操作都是并发安全的,不需要加锁。注意,使用 sync.Map{} 的 Load、Store、Delete 和 Range 方法时不能使用普通的 map 对象或并发访问会发生竞争。