简介
go语言自带的map,不具备线程安全;所以为了实现线程安全,可以使用sync.Map
具体示例见如下代码
package main
import (
"fmt"
"sync"
)
func main() {
var testMap sync.Map
// 获取a对应的键值应该失败
valueA,ok := testMap.Load("a")
if ok {
fmt.Println("a", valueA)
} else {
fmt.Println("a no value" ) // true
}
// 设置a对应的键值,然后再获取
testMap.Store("a", "ok1")
valueA,ok = testMap.Load("a")
if ok {
fmt.Println("a", valueA) // true
} else {
fmt.Println("a no value")
}
// 设置a对应的键值,然后再获取
testMap.Store("a", "ok2")
valueA,ok = testMap.Load("a")
if ok {
fmt.Println("a", valueA) // true
} else {
fmt.Println("a no value")
}
// 设置a对应的键值,然后再获取
// 若a存在对应键值,则只是获取,不设置新值
valueA,ok = testMap.LoadOrStore("a", "ok3")
if ok {
fmt.Println("a", valueA) // true
} else {
fmt.Println("a no value")
}
valueA,ok = testMap.Load("a")
if ok {
fmt.Println("a", valueA) // true
} else {
fmt.Println("a no value")
}
// 若a不存在对应键值,则进行设置
valueB,ok := testMap.LoadOrStore("b", "ok3")
if ok {
fmt.Println("b", valueB)
} else {
fmt.Println("b no value") // true
}
valueB,ok = testMap.Load("b")
if ok {
fmt.Println("b", valueB) // true
} else {
fmt.Println("b no value")
}
// 遍历
testMap.Range(func(key, value interface{}) bool {
keyInfo := key.(string)
valueInfo := value.(string)
fmt.Println("keyInfo", keyInfo, "valueInfo", valueInfo)
return true
})
// 删除
testMap.Delete("a")
}
运行结果
a no value
a ok1
a ok2
a ok2
a ok2
b no value
b ok3
keyInfo a valueInfo ok2
keyInfo b valueInfo ok3