Sync.Map是利用了原子操作来减少锁的使用,下面这篇文章和大家一起聊聊sync.Map 的基本用法以及具体的使用使用场景,下面一起来看一下,希望能够帮助到各位。
一起聊聊sync.Map 的基本用法
Sync.Map 的使用还是挺简单的,map 中有的操作,在 sync.Map 都有,区别是在 sync.Map 中,所有的操作都需要通过调用其方法来进行。sync.Map 里面几个常用的方法:
● Store:我们新增或者修改数据的时候,都可以使用 Store 方法。
● Load:读取数据的方法。
● Range:遍历数据的方法。
● Delete:删除数据的方法。
var m sync.Map
// 写入/修改
m.Store("foo", 1)
// 读取
fmt.Println(m.Load("foo")) // 1 true
// 遍历
m.Range(func(key, value interface{}) bool {
fmt.Println(key, value) // foo 1
return true
})
// 删除
m.Delete("foo")
fmt.Println(m.Load("foo")) // nil false
注意:在 sync.Map 中,key 和 value 都是 interface{} 类型的,也就是说,我们可以使用任意类型的 key 和 value。 而不像 map,只能存在一种类型的 key 和 value。从这个角度来看,它的类型类似于 map[any]any。
另外一个需要注意的是,Range 方法的参数是一个函数,这个函数如果返回 false,那么遍历就会停止。
sync.Map 的使用场景
在 sync.Map 源码中,已经告诉了我们 sync.Map 的使用场景:
The Map type is optimized for two common use cases: (1) when the entry for a given
key is only ever written once but read many times, as in caches that only grow,
or (2) when multiple goroutines read, write, and overwrite entries for disjoint
sets of keys. In these two cases, use of a Map may significantly reduce lock
contention compared to a Go map paired with a separate Mutex or RWMutex.
翻译过来就是,Map 类型针对两种常见用例进行了优化:
● 当给定 key 的条目只写入一次但读取多次时,如在只会增长的缓存中。(读多写少)
● 当多个 goroutine 读取、写入和覆盖不相交的键集的条目。(不同 goroutine 操作不同的 key)。
关于sync.Map 的基本用法解析就到这里,翼速应用平台内有更多相关资讯,欢迎查阅!
我来说两句