Go 语言中提供的 map 是协程不安全的,所以在进行并发读写时往往需要加锁,单效率并不高。为了解决这个问题,Go 语言在 1.9 版本中提供了一个效率较高的并发安全的 sync.Map。sync.Map 与 map 不同,并不是以语言原生状态提供的,而是在 sync 包下的一个特殊结构。
sync.Map 主要有一下几点特性:
- 无需初始化,声明即可用;
- sync.Map 不能使用 map 的形式进行取值和赋值操作,而是通过 sync.Map 提供的 Store、Load 和 Delete 方法操作;
- 遍历 sync.Map 需使用其自身提供的 Range 方法,并传入一个类型为
func(interface{}, interface{}) bool
的回调函数。函数返回 true 则继续遍历,返回 false 则跳出遍历; ```go package main
import ( “fmt” “sync” )
func main() { var syncMap sync.Map syncMap.Store(“key1”, “value1”) syncMap.Store(“key2”, “value2”) syncMap.Store(“key3”, “value3”)
fmt.Println(syncMap.Load("key1"))
syncMap.Delete("key1")
if v, ok := syncMap.Load("key1"); ok {
fmt.Println(v)
}
rangeFunc := func(k, v interface{}) bool {
fmt.Println(k, ":", v)
return true
}
syncMap.Range(rangeFunc)
} ```