0
点赞
收藏
分享

微信扫一扫

go语言之sync.Map

三分梦_0bc3 2022-03-16 阅读 97

简介
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
————————————————

举报

相关推荐

0 条评论