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

福哥答案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设置为新创建的桶中的第一个溢出桶的位置。

原文地址:https://www.cnblogs.com/waitmoon/p/14091182.html