Golang 切片slice简要归纳

  切片的本质是一个连续内存的数组。

  切片由以下三个部分组成:

  成员空间+当前成员数+最大成员数

  当前成员数即为len,最大成员数即capacity(这个属性和字符串末尾的字节个数类似),使用len的原因是为了防止切片成员发生越界。

  

  切片是长度可变的,因此在成员数增加的过程中会发生扩容,具体的判断规则如下:

  原有容量为oldCap,现有成员数为cap,新容量为newCap

  1.原有容量翻倍后,是否小于现有成员数,是则直接扩容到现有成员数的容量?————如果oldCap*2 < cap,则newCap = cap

  2.翻倍后大于现有成员数,则判断旧容量是否小于1024,如果小于则直接翻倍,扩容100%;

     如果大于1024,则扩容25%

 

  注意最终所得的实际容量并不一定完全等于newCap,而是大于等于newCap,因为Golang的内存管理模块提前向操作系统申请了内存块(如4字节、16字节、32字节大小),最终分配给切片的,将从这些内存块中合理选择。

posted @ 2022-03-05 22:38  J0nathan1ei  阅读(117)  评论(0)    收藏  举报