等量扩容后的数据:
等量扩容后,查找方式和原本相同,不多做赘述 。
两倍扩容后的数据
两倍扩容后,oldbuckets 的元素 , 可能被分配成了两部分 。查找顺序如下:
此处只分析mapaccess1 , 。mapaccess2相比mapaccess1 多添加了是否找到的bool值,有兴趣可自行看一下 。
使用方式:
步骤如下:
扩容条件 :
扩容的标识 : h.oldbuckets != nil
假设当前定位到了新的buckets的3号桶中,首先会判断oldbuckets中的对应的桶有没有被搬迁过 。如果搬迁过了,不需要看原来的桶了,直接遍历新的buckets的3号桶 。
扩容前:
等量扩容结果
双倍扩容会将old buckets上的元素分配到x,y两个部key1B == 0 分配到x部分,key1B == 1 分配到y部分
注意: 当前只对双倍扩容描述, 等量扩容只是重新填充了一下元素,相对位置没有改变 。
假设当前map 的B == 5,原本元素经过hash函数计算的 hash 值为:
因为双倍扩容之后 B = B + 1,此时B == 6 。key1B == 1, 即 当前元素rehash到高位,新buckets中 y 部分. 否则 key1B == 0 则rehash到低位,即x 部分 。
使用方式:
可以看到,每一遍历生成迭代器的时候,会随机选取一个bucket 以及 一个cell开始 。从前往后遍历,再次遍历到起始位置时,遍历完成 。
【go语言结构转map go map转string】关于go语言结构转map和go map转string的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。
推荐阅读
- 微信直播视频号开通多少钱的简单介绍
- Sap定义凭证字段必填,sap凭证编号怎么定义的
- thinkphpd模型,thinkphp 模型
- php判断是否提交数据 php判断是否提交数据怎么操作
- 晚会拍摄用什么色温,拍晚会用什么对焦模式
- 腾讯手游助手ios端停止注册,腾讯手游助手ios账号
- 学习go语言入门 go语言入门经典
- 安卓怎么停止微信下载qq浏览器,微信自动下载游览器
- 如何用chatgpt帮论文降重,论文查重降重软件