前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Golang sync.Map 简介与用法

Golang sync.Map 简介与用法

作者头像
恋喵大鲤鱼
发布2019-07-12 12:33:55
10.6K0
发布2019-07-12 12:33:55
举报
文章被收录于专栏:C/C++基础

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

代码语言:javascript
复制
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{},表示可存储任意类型的数据。示例代码如下:

代码语言:javascript
复制
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)
}

编译运行输出:

代码语言:javascript
复制
Load: v, ok = 27, true
LoadOrStore: v, ok = 18, false
Range: k, v = dablelv, 18
Range: k, v = cat, 28

参考文献

[1] Golang

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019年07月11日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 参考文献
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档