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

2020-12-07 11:35:33 浏览数 (2)

福哥答案2020-12-05:答案来自此链接:

源码位于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设置为新创建的桶中的第一个溢出桶的位置。

0 人点赞