Go语言sync.Map

Go语言sync.Map教程

Go 语言map 如果在并发读的情况下是线程安全的,如果是在并发写的情况下,则是线程不安全的。Golang 为我们提供了一个 sync.Map 是并发写安全的。

Golang 中的 map 的 key 和 value 的 类型 必须是一致的,但 sync.Map 的 key 和 value 不一定是要相同的类型,不同的类型也是支持的。

Go语言sync.Map特性

Go 语言 sync.Map 无须初始化,直接声明即可使用。

sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。

使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true ,终止迭代遍历时,返回 false。

sync.Map声明

语法

var mapName sync.Map

说明

声明一个 变量 名为 mapName 的 sync.Map,声明为可以立即使用。

案例

创建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) }

程序运行后,控制台输出如下:

78 golang syncMap.png

我们创建了一个有三个元素的 map,该 map 定义完之后可以直接使用, map 的三个 key 分别为 “Server”,“JavaScript” 和 “Db”。

获取map类型

使用 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)) }

程序运行后,控制台输出如下:

79 golang syncMap.png

我们创建了一个 sync.Map 类型的 map,并使用 reflect.TypeOf 获取该 map 的类型。

访问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) }

程序运行后,控制台输出如下:

80 golang syncMap.png

使用 syncMap.Load,可以访问 syncMap 的元素。

Go语言sync.Map总结

Go 语言 sync.Map 无须初始化,直接声明即可使用。sync.Map 不能使用 map 的方式进行取值和设置等操作,而是使用 sync.Map 的方法进行调用,Store 表示存储,Load 表示获取,Delete 表示删除。

使用 Range 配合一个回调函数进行遍历操作,通过回调函数返回内部遍历出来的值,Range 参数中回调函数的返回值在需要继续迭代遍历时,返回 true,终止迭代遍历时,返回 false。