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