Go 1.9 sync.Map

作者: ljh123 | 来源:发表于2018-09-19 14:34 被阅读27次

    原生的map在没有加锁的情况下用于协程是数据不安全,并且因为不安全,在编译的时候编译器也会报错。
    如果要在多个协程中使用同一个map变量,则需要自己进行加解锁操作。

    在Go 1.9中,标准库中加入了协程安全的map,这个sync.Map有以下这个公开的方法:
    Store
    LoadOrStore
    Load
    Delete
    Range

    下面分别介绍下这几个方法的用法,其实现原理也在最后面给出相应的原理。
    (1)Store(key, value interface{})
    说明:存储一个设置的键值。
    (2)LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
    说明:存在则返回原值, true,不写入传入值。不存在则存入,并返回最新值和false
    (3)Load(key interface{}) (value interface{}, ok bool)
    说明:读取存储在map中的值,如果没有nil,则返回nil。OK的结果表示是否是map中找到值。
    (4)Delete(key interface{})
    说明:删除键对应的值。
    (5)Range(f func(key, value interface{}) bool)
    说明:循环读取map中的值

    简单使用:

    package main
    
    import (
        "sync"
        "fmt"
    )
    
    func main() {
        // 1)定义一个sync.Map变量
        var m  sync.Map
        // 2)存储到m中
        m.Store("k", "123")
        m.Store("k12", "dsad")
        m.Store("dsa", "dasd")
        m.Store("hel", "dsawe231")
        fmt.Println(m)
        // 3)读取m中内容
        val, err := m.Load("k")
        fmt.Println(val, err)
        // 4)删除m中内容
        m.Delete("k")
        val, err = m.Load("k")
        fmt.Println(val, err)
        // 5)遍历
        m.Range(func(key, value interface{}) bool {
            // 返回true则继续,返回false则停止
            fmt.Println(key, value)
            return true
        })
        // 6)存在则返回原值, true,不写入传入值。不存在则存入,并返回最新值和false
        m.Store("val", 123)
        fmt.Println(m.LoadOrStore("val", "abc"))
        fmt.Println(m.Load("val"))
        fmt.Println(m.LoadOrStore("val", "abc123"))
    
    }
    

    参考文章:
    1)https://blog.csdn.net/champly/article/details/77622328
    2)https://segmentfault.com/a/1190000010294041

    相关文章

      网友评论

        本文标题:Go 1.9 sync.Map

        本文链接:https://www.haomeiwen.com/subject/ahdinftx.html