首页 > 其他分享 >Go-Map相关

Go-Map相关

时间:2023-05-31 18:24:40浏览次数:39  
标签:Map key sync value interface 哈希 Go 相关

Go中map默认不安全的,也实现了并发安全的对象:sync.Map

并发不安全

不安全是因为源码中没有实现读写分离。进行了判断异常:

在哈希表写操作时,会将哈希表的标志位 hashWriting 设置为 1,以表明当前正在执行写操作。当其他协程执行哈希表的读操作时,会根据当前的标志位判断是否能够执行读操作,如果标志位为 hashWriting,则说明当前正在执行写操作,就会抛出 concurrent map read and map write 的异常,提示读写并发冲突。

    if h.flags&hashWriting != 0 {
        fatal("concurrent map read and map write")
    }

sync.Map

要在并发环境下安全地使用哈希表,需要使用 Go 语言提供的并发安全的哈希表 sync.Map。使用 sync.Map 可以避免在多个协程同时读写哈希表时发生并发冲突的问题。

sync.Map 中的读写操作是并发安全的,因为它内部实现了读写锁,能够保证并发读写时的线程安全。sync.Map 的读写操作与普通哈希表的操作基本相同,主要有以下几个方法:

  • Load(key interface{}) (value interface{}, ok bool):根据键获取值,并返回是否存在;
  • Store(key, value interface{}):根据键存储值;
  • LoadOrStore(key, value interface{}) (actual interface{}, loaded bool):根据键获取值,如果不存在则存储给定的值;
  • Delete(key interface{}):删除给定键的值;
  • Range(f func(key, value interface{}) bool):遍历哈希表,并将每个键值对传递给给定的函数 f。
// 创建一个 sync.Map 对象
    var m sync.Map

    // 存储数据
    m.Store("key1", "value1")
    m.Store("key2", "value1")

    // 加载数据
    //if value, ok := m.Load("key1"); ok {
    //    fmt.Println(value)
    //}

    m.Load("key2")
    // 删除数据
    //m.Delete("key1")

    // 遍历哈希表
    m.Range(func(key, value interface{}) bool {
        fmt.Println(key, value)
        return true
    })
    
    //key1 value1
    //key2 value1

 

 

 

 

 

标签:Map,key,sync,value,interface,哈希,Go,相关
From: https://www.cnblogs.com/coder2020/p/17335274.html

相关文章

  • 1008.Django项目用户功能之docker
    docker跟virtualbox一样:是一个虚拟软件,可以创建多个程序的运行环境。docker与virtualbox的差别:docker不会虚拟出自己的内核,而是直接使用宿主机的内核。为什么要用docker? 集群:分布式相关的环境使用和部署mysql长沙 mysql北京 mysql上海 数据同步,可以相互提供数据服务,而......
  • 基于multiprocessing map实现python并行化(全局变量共享 map机制实用向分析 常见问题 p
    转载:(15条消息)基于multiprocessingmap实现python并行化(全局变量共享map机制实用向分析常见问题pandas存储数据)_goto_past的博客-CSDN博客基于multiprocessingmap实现python并行化之前从来没考虑python可以并行化,最近有一个项目需要计算100*100次的遗传算法适应度,每次计算......
  • Google Pixel 4 Android13 刷入Magisk + KernelSU 双root环境
    本文所有教程及源码、软件仅为技术研究。不涉及计算机信息系统功能的删除、修改、增加、干扰,更不会影响计算机信息系统的正常运行。不得将代码用于非法用途,如侵立删!GooglePixel4Android13刷入Magisk+KernelSU双root环境环境win10Pixel4Android13下载官方rom包......
  • HashMap 源码解毒
    PUT方法解毒:hashcode高低16进行异或运算,尽量降低哈希冲突的概率如果数组很小,hashcode的高位就不能被很好利用。finalVputVal(inthash,Kkey,Vvalue,booleanonlyIfAbsent,booleanevict){Node<K,V>[]tab;Node<K,V>p;intn,i;......
  • mongodb压缩——snappy、zlib块压缩,btree索引前缀压缩
    MongoDB3.0WiredTigerCompressionandPerformanceOneofthemostexcitingdevelopmentsoverthelifetimeofMongoDBmustbetheinclusionoftheWiredTigerstorageengineinMongoDB3.0.Itsverydesignandcorearchitecturearelegionsaheadofthecurr......
  • golang实现设计模式之抽象工厂模式总结-代码、优缺点、适用场景
    抽象工厂模式也是一种创建型的设计模式,其是在工厂模式的基础上实现更高程度的内聚。我们知道在工厂模式中,一种产品类就需要新建个对应的工厂类生成产品的实例,这会有什么问题呢?虽然工厂模式解决了简单工厂模式不好扩展的问题,实现了OCP,但一种产品就需要新建一个工厂类,比如有10000种......
  • Gorm - 使用gorm时进行执行自定义SQL的几种方式
    1、当只需要执行某个SQL而不需要进行获取返回值时//如果其中有变量,则使用?进行占位,sql:="要执行的SQL"//在Exec方法中在sql后面可以使用多个参数作为占位的补充//例如需要name=?,则写法可以使用util.Db.Exec(sql,"张三").Errorerr:=util.Db.Exec......
  • Java中常见转换-数组与list互转、驼峰下划线互转、Map转Map、List转Map、进制转换的多
    场景Java中数组与List互转的几种方式数组转List1、最简单的方式,Arrays.asList(array);创建的是不可变列表,不能删除和新增元素String[]array=newString[]{"a","b"};List<String>stringList=Arrays.asList(array);System.out.println(strin......
  • golang实现设计模式之工厂模式总结-代码、优缺点、适用场景
    工厂模式也是一种创建型模式,它与简单工厂不同的是将实例的创建推迟到具体的工厂类方法中实现,每一种产品生成一个对应的工厂,从而替换掉简单工厂方法模式中那个静态工厂方法。所以在工厂模式中,不同产品就由不同的工厂生产,每次增加产品时,我们就不需要在类似在简单工厂中,在统一的工厂......
  • GO分支循环
    (文章目录)单分支ifcondition{代码块}if5>2{fmt.Println("5greaterthan2")}==注意==:Go语言中,花括号一定要跟着if、for、func等行的最后,否则语法出错。这其实就是为了解决C风格、Java风格之争。condition必须是一个bool类型,在Go中,不能使用其他类型等效......