2020-12-05:go中,map的扩容流程是什么?

举报
福大大架构师每日一题 发表于 2020/12/05 21:24:17 2020/12/05
【摘要】 福哥答案2020-12-05:[答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=13)源码位于runtime/map.go文件中的hashGrow函数。在向map中添加数据时,当达到某个条件,则会引发字典扩容。扩容条件:1.map中数据总个数/桶个数>6.5,引发翻倍扩容。mapassign中的overLoadFactor函数。...

福哥答案2020-12-05:[答案来自此链接:](https://www.bilibili.com/video/BV1Nr4y1w7aa?p=13)

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

在向map中添加数据时,当达到某个条件,则会引发字典扩容。

扩容条件:
1.map中数据总个数/桶个数>6.5,引发翻倍扩容。mapassign中的overLoadFactor函数。
2.使用了太多的溢出桶时(溢出桶使用的太多会导致map处理速度降低)。mapassign中的tooManyOverflowBuckets函数。
B<=15,已使用的溢出桶个数>=2的B次方时,引发等量扩容。
B>15,已使用的溢出桶个数>=2的15次方时,引发等量扩容。

当扩容之后:
1.B会根据扩容后新桶的个数进行增加(翻倍扩容 新B=旧B+1,等量扩容 新B=旧B)。
2.oldbuckets指向原来的桶(旧桶)。
3.buckets指向新创建的桶(新桶中暂时还没有数据)。
4.nevacuate设置为0,表示如果数据迁移的话,应该从原桶(旧桶)中的第0个位置开始迁移。
5.noverflow设置为0,扩容后新桶中已使用的溢出桶为0。
6.extra.oldoverflow设置为原桶(旧桶)已使用的所有溢出桶。即:h.extra.oldoverflow = h.extra.overflow。
7.extra.overflow设置为nil,因为新桶中还未使用溢出桶。
8.extra.nextOverflow设置为新创建的桶中的第一个溢出桶的位置。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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