原生的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 mainimport ( "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")) }
作者:laijh
链接:https://www.jianshu.com/p/c91685af8ba6
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦