■实例说明
在多个goroutine中操作map,很容易引起程序崩溃,这个时候,我们需要使用并发安全的sync.map
1)sync.map的各种用法
■实例代码
[Golang] 纯文本查看 复制代码 package main
import (
"fmt"
"sync"
)
func main() {
// 创建goroutine安全的map
sm := sync.Map{}
// 等待多个写成执行完成
wc := sync.WaitGroup{}
for i := 0; i < 10; i++ {
wc.Add(1)
go func(i int) {
defer wc.Done()
// 【1】业务代码,向map中保存数据
k := fmt.Sprintf("key%d", i)
sm.Store(k, i)
// 【2】获取键值k对应的值,如果存在,则返回该值,如果该键不存在,则将默认值存入,并返回
// loaded=true,则返回的是已有的值,如果返回false,则返回的是默认值,即原来没有这个键值
v, loaded := sm.LoadOrStore("k", i)
fmt.Printf("v:%+v, loaded=%+v\n", v, loaded)
if i == 2 {
// 【3】删除某个键值
sm.Delete(i)
}
}(i)
}
wc.Wait()
// 【5】遍历map
sm.Range(func(key, value interface{}) bool {
fmt.Printf("key=%+v, value=%+v\n", key, value)
// 注意,如果合理返回false,则停止遍历
if key.(string) == "key3" {
return false
}
return true
})
// 【6】获取map中数据
value1, _ := sm.Load("key1")
v1, ok := value1.(int)
if ok {
fmt.Printf("v1=%d", v1)
}
}
|