Golang sync.Map 简介与用法

Golang 中的 map 在并发情况下,只读是线程安全的,并发读写线程不安全。为了解决这个问题,Golang 提供了语言层级的并发读写安全的 sync.Map。

type Map struct {
	// contains filtered or unexported fields
}

//删除操作
func (m *Map) Delete(key interface{})

//读操作
func (m *Map) Load(key interface{}) (value interface{}, ok bool)

//读取或写入。存在指定的 key 则读取,否则写入。actual为存在的 value 或新写入的 value,loaded 读操作返回true,写操作返回false
func (m *Map) LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)

//写操作
func (m *Map) Store(key, value interface{})

//遍历
func (m *Map) Range(f func(key, value interface{}) bool)

sync.Map 开箱即用,无需像 map 调用 make() 进行显示初始化。此外,sync.Map 的 key 和 value 类型为空接口 interface{},表示可存储任意类型的数据。示例代码如下:

package main

import (
    "fmt"
    "sync"
)

var m sync.Map

func main() {
    
    //写
    m.Store("dablelv", "27")
    m.Store("cat", "28")
    
    //读
    v, ok := m.Load("dablelv")
    fmt.Printf("Load: v, ok = %v, %v\n", v, ok) 
   
    //删除  
    m.Delete("dablelv")

    //读或写
    v, ok = m.LoadOrStore("dablelv", "18")
    fmt.Printf("LoadOrStore: v, ok = %v, %v\n", v, ok)

    //遍历
    //操作函数
    f := func(key, value interface{}) bool {
        fmt.Printf("Range: k, v = %v, %v\n", key, value)
        return true
    }   
    m.Range(f)
}

编译运行输出:

Load: v, ok = 27, true
LoadOrStore: v, ok = 18, false
Range: k, v = dablelv, 18
Range: k, v = cat, 28

参考文献

[1] Golang

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券