时间:2022-08-21 10:00:13 | 栏目:Golang | 点击:次
在 Golang 中 map 不是并发安全的,自 1.9 才引入了 sync.Map ,sync.Map 的引入确实解决了 map 的并发安全问题,不过 sync.Map 却没有实现 len() 函数,如果想要计算 sync.Map 的长度,稍微有点麻烦,需要使用 Range 函数。
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
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> false
1 true...
999 true
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
func main() { demo := sync.Map{} for j := 0; j < 1000; j++ { demo.Store(j, j) } lens := 0 demo.Range(func(key, value interface{}) bool { lens++ return true }) fmt.Println("len of demo:", lens) }
执行输出:
len of demo: 1000
小结