Go 语言 中 sync.Map 的 LoadOrStore 函数 表示,如果我们获取的 key 存在,那么就返回 key 对应的元素,如果获取的 key 不存在,那么就返回我们设置的值,并且将我们设置的值,存入 map。

sync.Map LoadOrStore函数

func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) 

参数

参数 描述
m sync.Map 对象
key map 中元素的键
value map 中元素的值

返回值

返回值 描述
actual 获取到的值,或者被添加的值
loaded key 在 map 中是否存在

说明

在 map 中获取键为 key 的元素值,如果 key 存在,则将获取的值通过 actual 返回,loaded 返回 true。如果 key 不存在,那么就将 key 和 value 添加加 sync.Map,actual 返回 value,loaded 返回 false。

案例

sync.Map LoadOrStore元素存在

sync.Map LoadOrStore 元素存在,返回元素值和 ture

package main

import (
    "fmt"
    "sync"
)

func main() {
    //sync.Map LoadOrStore 元素存在,返回元素值和 ture
    var mapHaiCoder sync.Map
    mapHaiCoder.Store("Server", "Golang")
    mapHaiCoder.Store("JavaScript", "Vue")
    mapHaiCoder.Store("Db", "Redis")
    fmt.Println(mapHaiCoder.LoadOrStore("Server", "ServerData"))
    fmt.Println(mapHaiCoder.LoadOrStore("JavaScript", "JavaScriptData"))
}

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

Golang true
Vue true

使用 LoadOrStore 获取 sync.Map 的元素时,如果 KEY 存在,那么返回 KEY 对应的元素值和 ture。

sync.Map LoadOrStore元素不存在

sync.Map LoadOrStore 元素不存在,返回设置的元素值和 false

package main

import (
    "fmt"
    "sync"
)

func main() {
    //sync.Map LoadOrStore 元素不存在,返回设置的元素值和 false
    var mapHaiCoder sync.Map
    mapHaiCoder.Store("Server", "Golang")
    mapHaiCoder.Store("JavaScript", "Vue")
    mapHaiCoder.Store("Db", "Redis")
    fmt.Println(mapHaiCoder.LoadOrStore("ServerData", "ServerData"))
    fmt.Println(mapHaiCoder.LoadOrStore("JavaScriptData", "JavaScriptData"))
}

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

ServerData false
JavaScriptData false

使用 sync.Map LoadOrStore 获取 sync.Map 的 KEY 不存在时,返回设置的元素值和 false。

sync.Map LoadOrStore 元素不存在,添加元素

使用 sync.Map Load 获取 KEY 不存在的元素时,会将 key 和 value 添加进 map

package main

import (
    "fmt"
    "sync"
)

func walk(key, value interface{}) bool {
    fmt.Println("Key =", key, "Value =", value)
    return true
}
func main() {
    //使用 sync.Map Load 获取 KEY 不存在的元素时,会将 key 和 value 添加进 map
    var mapHaiCoder sync.Map
    mapHaiCoder.Store("Server", "Golang")
    mapHaiCoder.Store("JavaScript", "Vue")
    mapHaiCoder.Store("Db", "Redis")
    mapHaiCoder.LoadOrStore("ServerData", "ServerData")
    mapHaiCoder.LoadOrStore("JavaScriptData", "JavaScriptData")
    mapHaiCoder.Range(walk)
}

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

Key = ServerData Value = ServerData
Key = JavaScriptData Value = JavaScriptData
Key = Server Value = Golang
Key = JavaScript Value = Vue
Key = Db Value = Redis

首先,创建了一个三个元素的 sync.Map,接着我们再次使用 LoadOrStore 访问两个 key 都不存在的元素,最后我们使用 Range 遍历所有的元素。

此时,我们发现,使用 LoadOrStore 添加的两个新 KEY 和 VALUE 都存在了 map 中,即使用 LoadOrStore 访问不存在的元素时,元素会被添加进 map。

Go语言sync.Map获取元素总结

Go 语言中 sync.Map 的 LoadOrStore 函数表示,如果我们获取的 key 存在,那么就返回 key 对应的元素,如果获取的 key 不存在,那么就返回我们设置的值,并且将我们设置的值,存入 map。

Go 语言 sync.Map LoadOrStore 语法:

func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool) 

转自:https://haicoder.net/golang/golang-syncmap-loadorstore.html