1、slice结构体
type slice struct { array unsafe.Pointer // 底层数组指针,真正存放数据的地方 len int // 切片长度,通过 len(slice) 返回 cap int // 切片容量,通过 cap(slice) 返回 }
2、slice初始化
- make:会直接给底层数组分配内存,指定长度和容量,超出长度范围的不能访问
- new:不会立马给底层数组分配内存,返回的是底层数组起始地址
3、slice扩容机制
- 当cap不够时,append会触发扩容
- len < 1024,扩容cap直接翻倍
- len >= 1024,扩容1/4
4、slice内存分配
- 内存分配不是按照cap扩容变化的
- go底层有内存管理模块,负责分配一定规模大小内存块(如8byte、16byte、32byte、48byte等)
- 当slice的cap变大时,内存分配是按照满足内存需求最小且最接近所需内存