Go-Map相关

发布时间 2023-05-31 18:17:02作者: Bit0101

Go中map默认不安全的,也实现了并发安全的对象:

 

 

 

 

// 创建一个 sync.Map 对象
    var m sync.Map

    // 存储数据
    m.Store("key1", "value1")
    m.Store("key2", "value1")

    // 加载数据
    //if value, ok := m.Load("key1"); ok {
    //    fmt.Println(value)
    //}

    m.Load("key2")
    // 删除数据
    //m.Delete("key1")

    // 遍历哈希表
    m.Range(func(key, value interface{}) bool {
        fmt.Println(key, value)
        return true
    })
    
    //key1 value1
    //key2 value1

 不安全是因为源码中没有实现读写锁。进行了判断异常:

在哈希表写操作时,会将哈希表的标志位 hashWriting 设置为 1,以表明当前正在执行写操作。当其他协程执行哈希表的读操作时,会根据当前的标志位判断是否能够执行读操作,如果标志位为 hashWriting,则说明当前正在执行写操作,就会抛出 concurrent map read and map write 的异常,提示读写并发冲突。

    if h.flags&hashWriting != 0 {
        fatal("concurrent map read and map write")
    }