首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >2020-11-28:go中,map的写流程是什么?

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

原创
作者头像
福大大架构师每日一题
修改2020-11-30 14:29:13
修改2020-11-30 14:29:13
4880
举报

福哥答案2020-11-28:

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

info"name"="福大大"

bilibili视频里的步骤:答案来自此链接

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.返回新设置的元素。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档