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字节大小),最终分配给切片的,将从这些内存块中合理选择。

浙公网安备 33010602011771号