Go 1.9 sync.Map

简介: 原生的map在没有加锁的情况下用于协程是数据不安全,并且因为不安全,在编译的时候编译器也会报错。如果要在多个协程中使用同一个map变量,则需要自己进行加解锁操作。

原生的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 main

import (
    "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"))

}

参考文章:
1)https://blog.csdn.net/champly/article/details/77622328
2)https://segmentfault.com/a/1190000010294041

目录
相关文章
|
4月前
|
Go
go语言中遍历映射(map)
go语言中遍历映射(map)
127 8
|
25天前
|
存储 缓存 安全
Go 语言中的 Sync.Map 详解:并发安全的 Map 实现
`sync.Map` 是 Go 语言中用于并发安全操作的 Map 实现,适用于读多写少的场景。它通过两个底层 Map(`read` 和 `dirty`)实现读写分离,提供高效的读性能。主要方法包括 `Store`、`Load`、`Delete` 等。在大量写入时性能可能下降,需谨慎选择使用场景。
|
2月前
|
存储 安全 Go
Go语言中的map数据结构是如何实现的?
Go 语言中的 `map` 是基于哈希表实现的键值对数据结构,支持快速查找、插入和删除操作。其原理涉及哈希函数、桶(Bucket)、动态扩容和哈希冲突处理等关键机制,平均时间复杂度为 O(1)。为了确保线程安全,Go 提供了 `sync.Map` 类型,通过分段锁实现并发访问的安全性。示例代码展示了如何使用自定义结构体和切片模拟 `map` 功能,以及如何使用 `sync.Map` 进行线程安全的操作。
|
7月前
|
Go
Go 语言为什么不支持并发读写 map?
Go 语言为什么不支持并发读写 map?
|
3月前
|
Go
go语言for遍历映射(map)
go语言for遍历映射(map)
99 12
|
4月前
|
存储 Go
go语言 遍历映射(map)
go语言 遍历映射(map)
66 2
|
6月前
|
Go 定位技术 索引
Go 语言Map(集合) | 19
Go 语言Map(集合) | 19
|
7月前
|
存储 算法 Java
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
Go 通过 Map/Filter/ForEach 等流式 API 高效处理数据
|
7月前
|
存储 安全 NoSQL
Go map 读写性能优化 - 分片 map
Go map 读写性能优化 - 分片 map
67 1
|
7月前
|
存储 人工智能 安全
go sync.Map 设计与实现
go sync.Map 设计与实现
52 1