Go 语言 中 map 如果在并发读的情况下是线程安全的,如果是在并发写的情况下,则是线程不安全的。Golang 为我们提供了一个 sync.Map 是并发写安全的。
Golang 中的 map 的 key 和 value 的 类型 必须是一致的,但 sync.Map 的 key 和 value 不一定是要相同的类型,不同的类型也是支持的。
Go 语言 sync.Map 无须初始化,直接声明即可使用。
sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。
使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true ,终止迭代遍历时,返回 false。
var mapName sync.Map
声明一个 变量 名为 mapName 的 sync.Map,声明为可以立即使用。
sync.Map 声明完之后,可以立即使用
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//sync.Map 声明完之后,可以立即使用
var mapHaiCoder sync.Map
mapHaiCoder.Store("Server", "Golang")
mapHaiCoder.Store("JavaScript", "Vue")
mapHaiCoder.Store("Db", "Redis")
fmt.Println(mapHaiCoder)
}
程序运行后,控制台输出如下:
我们创建了一个有三个元素的 map,该 map 定义完之后可以直接使用, map 的三个 key 分别为 “Server”,“JavaScript” 和 “Db”。
使用 TypeOf() 函数,获取 sync.Map 类型
package main
import (
"fmt"
"reflect"
"sync"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//使用 TypeOf() 函数,获取 sync.Map 类型
var mapHaiCoder sync.Map
mapHaiCoder.Store("Server", "Golang")
fmt.Println(reflect.TypeOf(mapHaiCoder))
}
程序运行后,控制台输出如下:
我们创建了一个 sync.Map 类型的 map,并使用 reflect.TypeOf 获取该 map 的类型。
使用 syncMap.Load,可以访问 syncMap 的元素
package main
import (
"fmt"
"sync"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
//使用 syncMap.Load,可以访问 syncMap 的元素
var mapHaiCoder sync.Map
mapHaiCoder.Store("Server", "Golang")
value, _ := mapHaiCoder.Load("Server")
fmt.Println("Value =", value)
}
程序运行后,控制台输出如下:
使用 syncMap.Load,可以访问 syncMap 的元素。
Go 语言 sync.Map 无须初始化,直接声明即可使用。sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。
使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。