之前的map都不是 线程安全 的,需要加锁实现。到Go1.9发布后有了新特性,有了sync.map,它是原生支持并发安全的map,不过它的用法和以前我们熟悉的map完全不一样,因为sync.map封装了更为复杂的数据结构,以实现比之前加锁map更优秀的性能。
数据结构:
type Map struct {
mu Mutex
read atomic.Value
dirty map[interface{}]*entry
misses int
}
用法结合示例:
sync.map:
声明变量 var m sync.Map
1.Store(key, value interface{})//存储一个设置的键值。
m.Store(“1”, “b”)
2.LoadOrStore(key, value interface{}) (actual interface{}, loaded bool)
//返回键的现有值(如果存在),否则存储并返回给定的值,如果是读取则返回true,如果是存储返回false。
v, ok := m.LoadOrStore(“1”, “a”)
3.Load(key interface{}) (value interface{}, ok bool )
//读取存储在map中的值,如果没有值,则返回 nil 。OK的结果表示是否在map中找到值。
v, ok = m.Load(“1”)
4.Delete(key interface{}) //删除键对应的值。
m.Delete(“1”)
5.Range(f func(key, value interface{}) bool) //循环读取map中的值。
m.Range(func(k, v interface{}) bool {
fmt.Println(k, v)
return true
})
小结: sync.Map没有Len方法,如果要用只能range一下,比较淡疼。
更多内容请关注头条号每日编程,每天进步一点。