Golang 中的 map 在并发情况下,只读是线程安全的,并发读写线程不安全。为了解决这个问题,Golang 提供了语言层级的并发读写安全的 sync.Map。
type Map struct {
// contains filtered or unexported fields
}
//删除操作
func (m *Map) Delete(key interface{})
//读操作
func (m *Map) Load(key interface{}) (value interface{}, ok bool)
//读取或写入。存在指定的 key 则读取,否则写入。actual为存在的 value 或新写入的 value,loaded 读操作返回true,写操作返回false
func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
//写操作
func (m *Map) Store(key, value interface{})
//遍历
func (m *Map) Range(f func(key, value interface{}) bool)
sync.Map 开箱即用,无需像 map 调用 make() 进行显示初始化。此外,sync.Map 的 key 和 value 类型为空接口 interface{},表示可存储任意类型的数据。示例代码如下:
package main
import (
"fmt"
"sync"
)
var m sync.Map
func main() {
//写
m.Store("dablelv", "27")
m.Store("cat", "28")
//读
v, ok := m.Load("dablelv")
fmt.Printf("Load: v, ok = %v, %v\n", v, ok)
//删除
m.Delete("dablelv")
//读或写
v, ok = m.LoadOrStore("dablelv", "18")
fmt.Printf("LoadOrStore: v, ok = %v, %v\n", v, ok)
//遍历
//操作函数
f := func(key, value interface{}) bool {
fmt.Printf("Range: k, v = %v, %v\n", key, value)
return true
}
m.Range(f)
}
编译运行输出:
Load: v, ok = 27, true
LoadOrStore: v, ok = 18, false
Range: k, v = dablelv, 18
Range: k, v = cat, 28
[1] Golang