源碼位於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設置為新創建的桶中的第一個溢出桶的位置。