2020-11-28:go中,map的写流程是什么?

举报
福大大架构师每日一题 发表于 2020/11/28 22:52:03 2020/11/28
【摘要】 福哥答案2020-11-28:源码位于runtime/map.go文件中的mapassign函数。info["name"]="福大大"bilibili视频里的步骤:[答案来自此链接](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=11)3.结合哈希因子和键name生成哈希值。5.获取哈希值的后B位,并根据后B位的值来决定将此键值对存放到哪个桶中(...

福哥答案2020-11-28:

源码位于runtime/map.go文件中的mapassign函数。

info["name"]="福大大"

bilibili视频里的步骤:[答案来自此链接](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=11)
3.结合哈希因子和键name生成哈希值。
5.获取哈希值的后B位,并根据后B位的值来决定将此键值对存放到哪个桶中(bmap)。
6.在上一步确定桶之后,接下来就在同种写入数据。
获取哈希值的tophash(即:哈希值的`高8位`),将tophash、key、value分别写入到桶中的上数组中。
如果桶已满,则通过overflow找到溢出桶,并在溢出桶中继续写入。
注意:以后再桶中查找数据时,会基于tophash来找(tophash相同则再去比较key)。
7.hmap的个数count++(map中的元素个数+1)。

看源码新增了一些步骤,忽略扩容:
1.如果map为nil,抛panic。
2.如果flags是【正在写】状态,抛throw。
3.结合哈希因子和键name生成哈希值。
4.修改flags为【正在写】状态。
5.获取哈希值的后B位,并根据后B位的值来决定将此键值对存放到哪个桶中(bmap)。
6.在上一步确定桶之后,接下来就在同种写入数据。
获取哈希值的tophash(即:哈希值的`高8位`),将tophash、key、value分别写入到桶中的上数组中。
如果桶已满,则通过overflow找到溢出桶,并在溢出桶中继续写入。
注意:以后再桶中查找数据时,会基于tophash来找(tophash相同则再去比较key)。
7.hmap的个数count++(map中的元素个数+1)。
8.如果flags不处于【正在写】状态,说明是并发写,抛throw。
9.修改flags,取消【正在写】状态。
10.返回新设置的元素。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

举报
请填写举报理由
0/200