对码当歌,猿生几何?

Go扩容

切片扩容

容量

  • 如果期望的容量是当前容量的两倍则使用期望容量

  • 如果期望容量小于1024则扩容到当前容量的2倍

  • 如果期望容量大于1024则扩容当前容量的25%直到满足当前容量需求

出触发条

只有添加新元素后的cap不满足时才会触发扩容, 扩容后返回一个新的slice结构体

处理方式

  • slice=append(slice, one)

        扩容后新的slice结构体赋给原slice

  • append(slice, one)

        则返回一个新slice


hash扩容

初始化

  • 当map中的桶的数量多于24时才会有溢出桶的存在,数量为2^B-4个,B为正常桶的数量

  • hash桶最多存储8个对象,如果超出则需要存储在溢出桶

触发条件

  1. hash装载因子大于6.5

  2. 溢出桶使用的太多,具体有个算法衡量

扩容方式

  1. 等量扩容,这种扩容是由于有大量写入和删除操作,导致溢出桶爆表,不断积累会造成内存泄漏,这种等量扩容,清除老的溢出桶并释放内存

  2. 翻倍扩容,这种由于装载因子过大触发,首先在写入或者删除操作时触发,创建一个2倍容量的桶,并把原有桶的数据赋值给oldBuckets, 并后续的写入和删除操作逐渐完成数据迁移。扩容期间会使用旧桶。