前言
在 Golang
中 map
不是并发安全的,自 1.9 才引入了 sync.Map
,sync.Map
的引入确实解决了 map
的并发安全问题,不过 sync.Map
却没有实现 len()
函数,如果想要计算 sync.Map
的长度,稍微有点麻烦,需要使用 Range
函数。
map 并发操作出现问题
funcmain(){demo:=make(map[int]int)gofunc(){forj:=0;j<1000;j++{demo[j]=j}}()gofunc(){forj:=0;j<1000;j++{fmt.Println(demo[j])}}()time.Sleep(time.Second*1)}
执行输出:
fatalerror:concurrentmapreadandmapwrite
sync.Map 解决并发操作问题
funcmain(){demo:=sync.Map{}gofunc(){forj:=0;j<1000;j++{demo.Store(j,j)}}()gofunc(){forj:=0;j<1000;j++{fmt.Println(demo.Load(j))}}()time.Sleep(time.Second*1)}
执行输出:
<nil>false1true...999true
计算 map 长度
funcmain(){demo:=make(map[int]int)forj:=0;j<1000;j++{demo[j]=j}fmt.Println("lenofdemo:",len(demo))}
执行输出:
lenofdemo:1000
计算 sync.Map 长度
funcmain(){demo:=sync.Map{}forj:=0;j<1000;j++{demo.Store(j,j)}lens:=0demo.Range(func(key,valueinterface{})bool{lens++returntrue})fmt.Println("lenofdemo:",lens)}
执行输出:
lenofdemo:1000
小结
Load
加载 key 数据
Store
更新或新增 key 数据
Delete
删除 key 数据
Range
遍历数据
LoadOrStore
如果存在 key 数据则返回,反之则设置
LoadAndDelete
如果存在 key 数据则删除
以上,希望对你能够有所帮助。