首页 > 其他分享 >golang map/sync.map 实现

golang map/sync.map 实现

时间:2023-10-10 15:25:35浏览次数:26  
标签:map Map sync golang 键值 哈希 Go

map

Go 中的 map 是一种高效的散列表(hash table)实现,它的底层实现细节包括以下重要方面:

  1. 哈希表(Hash Table)map 的底层数据结构是一个哈希表。哈希表是一个数组,每个元素都是一个哈希桶,用于存储键值对。

  2. 哈希函数(Hash Function):Go 使用哈希函数将键映射到哈希桶。这个哈希函数是内置的,并根据键的类型生成一个哈希值。哈希值的范围是哈希表的索引范围。

  3. 哈希冲突处理(Collision Handling):由于哈希函数的输出范围是有限的,不同的键可能映射到相同的哈希值,这就是哈希冲突。Go 的 map 使用链地址法(chaining)来处理碰撞。每个哈希桶内部维护一个链表,当多个键映射到同一个哈希桶时,它们被存储在链表中。

  4. 动态扩容(Dynamic Resizing):为了保持 map 的性能,Go 在必要时会自动扩展底层的哈希表。当哈希表中的元素数量超过了一定的阈值,map 会创建一个更大的哈希表,并将所有键值对重新分配到新的桶中。这可以防止哈希表变得过于拥挤,保持了快速的查找性能。

  5. 加载因子(Load Factor):加载因子是一个关键的概念,它表示哈希表中已使用的桶的比例。当加载因子超过一定阈值时,map 会触发动态扩容操作。这确保了哈希表的性能在一定范围内。

  6. 顺序迭代(Iteration Order):在 Go 1.12 及以后的版本中,map 开始保持了一定的插入顺序,这意味着你可以使用循环来按顺序迭代 map 中的键值对。这个特性是不断改进和优化的。

Go 的 map 不是线程安全的,如果需要在并发环境下使用 map,采取适当的同步措施,如使用互斥锁或使用并发安全的 sync.Map。是一种高效、易于使用的数据结构,但它的底层实现细节通常不需要担心,因为 Go 提供了一组简单而强大的操作接口来处理键值对的存储和检索。

sync.map

sync.Map 是 Go 语言标准库中提供的一种并发安全的哈希表(hash map)实现。它是 Go 1.9 版本中引入的,旨在解决在并发环境中使用普通 map 可能会导致竞态条件的问题。

以下是 sync.Map 的主要实现特点和机制:

  1. 并发安全性sync.Map 是为并发访问而设计的。它可以被多个 goroutine 安全地访问和修改,而无需额外的互斥锁(mutex)。

  2. 动态增长:与常规的 map 不同,sync.Map 在内部使用了一种精巧的数据结构,允许它自动扩展和缩小以适应并发需求。这使得它适用于高并发场景,而不会导致性能下降。

  3. Load 和 Store 操作sync.Map 提供了 LoadStore 方法来获取和存储键值对。这些操作是原子的,因此可以在多个 goroutine 中安全地使用。

  4. Delete 操作sync.Map 也提供了 Delete 方法来删除键值对。

  5. Range 迭代:通过 Range 方法,你可以在 sync.Map 上安全地迭代所有键值对。这个操作是并发安全的,可以在遍历过程中插入或删除键值对。

以下是一个示例,演示了如何使用 sync.Map

package main

import (
    "fmt"
    "sync"
)

func main() {
    // 创建一个 sync.Map
    var m sync.Map

    // 存储键值对
    m.Store("Alice", 90)
    m.Store("Bob", 85)
    m.Store("Charlie", 78)

    // 获取键值对
    alice, _ := m.Load("Alice")
    fmt.Println("Alice's Score:", alice)

    // 使用 Range 迭代所有键值对
    m.Range(func(key, value interface{}) bool {
        fmt.Printf("Key: %v, Value: %v\n", key, value)
        return true // 返回 true 继续迭代,返回 false 停止迭代
    })

    // 删除键值对
    m.Delete("Charlie")

    // 再次使用 Range 迭代
    m.Range(func(key, value interface{}) bool {
        fmt.Printf("Key: %v, Value: %v\n", key, value)
        return true
    })
}

需要注意的是,sync.Map 是在 Go 1.9 中引入的,因此要确保你的 Go 版本不低于 1.9 才能使用它。在处理高并发的键值对存储和检索需求时,sync.Map 是一个非常有用的工具,因为它提供了并发安全性和高性能。

标签:map,Map,sync,golang,键值,哈希,Go
From: https://www.cnblogs.com/sening/p/17754746.html

相关文章

  • java stream 操作map根据key或者value排序的实现
    javastream操作map根据key或者value排序的实现publicclassTest02{publicstaticvoidmain(String[]args){List<FundBenchMarkInfo>fundBenchMarkList=newArrayList<>();fundBenchMarkList.add(newFundBenchMarkInfo("2",new......
  • 线程安装-synchronized关键字
         ......
  • HashMap源代码的阅读
    Createdby徐庆杰,lastmodifiedon八月08,2023从名字上来看,HashMap应该是通过HashCode的方法存储Key值已达到降低检索时间复杂度的目的的HashMap继承了AbstractMap<K,V>抽象类,并且继承了Map<K,V>接口而AbstractMap<K,V>实现了Map<K,V>中的部分方法default关键字在翻找M......
  • ASP .Net Core: AutoMapper与DTO的使用(自定类型转换)
    建立DTO物件创建名为Dtos文件夹,并添加TodoListSelectDto文件publicclassTodoListSelectDto{publicGuidTodoId{get;set;}publicstringName{get;set;}=null!;publicDateTimeInsertTime{get;set;}publicDateTimeUpdateTime{get......
  • 解决 golang 中 grep console 插件不生效问题
    日志多了以后不好找,idea中的神奇grepconsole在goland竟然不好使了,一番查找下,找到了一个解决方案cmd+shift+a找到Registry找到go.run.processes.with.pty,改为false大功告成原贴:https://github.com/krasa/GrepConsole/issues/175......
  • 蓝牙MAP协议
    蓝牙MAP协议(MessageAccessProfile)是蓝牙技术联盟(BluetoothSIG)制定的一种蓝牙协议,用于手机和车载设备之间的短信同步。MAP协议可以让手机将短信发送到车载设备,也可以让车载设备将短信发送到手机。MAP协议的基本原理是使用OBEX协议传输短信数据。OBEX协议是一种无线文件传输协议......
  • map()函数
    1.函数作用:map()函数是python的一个内置函数,它的功能是:将指定的函数,依次作用于可迭代对象的每个元素,并返回一个迭代器对象。这个迭代器可以是一个,也可以是多个 2.map()的语法:map(function,iterable,...)参数:function-我们指定的函数(或数据类型),可以是python内......
  • 关联容器(map、set、multimap、multiset、pair、unordered_map)
    一、使用关联容器key---value)对:关键字起到索引的作用,值则表示与索引相关联的数据。set中每个元素只包含一个关键字;set支持高效的关键字查询操作---检查一个关键字是否在set中。multimap允许多个元素具有相同的关键字。   pair类型用于保存两个数据类型,pair的数据成员是public......
  • @GetMapping、@PostMapping、@PutMapping、@DeleteMapping 的区别?
    对于@GetMapping、@PostMapping、@PutMapping、@DeleteMapping,首先我们得谈到RESTFUL风格接口,常用的URL请求方式就包括了GET、POST、PUT、DELETE等:谈到@GetMapping、@PostMapping、@PutMapping、@DeleteMapping等注解,首先得讲到@RequestMaping:@RequestMaping主要是将HTTP请求映......
  • .sync 修饰符
    作用:可以实现子组件与父组件数据的双向绑定,简化代码特点:prop属性名可以自定义,非固定为value本质:就是  :属性名和@update:属性名的合写应用场景:封装弹窗类的基础组件,visible属性true显示,false隐藏 eg:父组件:<BaseDialog  :visible.sync="isShow"><......