Go 语言中切片的声明初始化和操作详解
· 阅读需 2 分钟
声明切片变量
声明:当声明一个切片变量如 var s []int
时,s
初始化为 nil
,表示它没有指向任何底层数组。其长度 (len
) 和容量 (cap
) 都为 0,无法访问或修改任何元素,因为实际上还没有底层数组与之关联。
使用 make 函数创建切片
内存分配:调用 make([]int, 3, 5)
时,底层会为切片分配一个长度(容量)为 5 的整型数组。这个数组是在堆上分配的,以便动态管理内存,允许切片在运行时调整大小。
初始化切片结构:切片结构体的实例会在栈上创建,包含三个关键的字段
- Pointer:指向已分配底层数组的第一个元素的指针。
- Len:设置为指定的长度,此例中为 3,意味着切片当前访问到的元素数量。
- Cap:设置为数组的总容量,此例中为 5,即最多可以扩展到的元素数量。
初始化数组元素:新分配的数组元素初始化为其类型的零值。对于 int
类型,每个元素都初始化为 0
。
使用字面量初始化切片
内存分配:使用字面量如 s := []int{1, 2, 3}
初始化切片时,底层同样会在堆上分配一个容纳 3 个整型元素的数组。
初始化切片结构:创建的切片结构体实例指向这个数组,长度和容量都设置为字面量中元素的数量,即 3。
填充数组元素:数组中的元素将直接使用提供的字面值(1, 2, 3)进行初始化,不使用零值。
切片操作
创建新切片:当执行 s2 := s[1:3]
的切片操作时,底层不会复制数组,而是创建一个新的切片结构体,指向原切片 s
的底层数组的第 2 个元素(索引 1)。
新切片属性
- Len:新切片的长度为
2
,因为它从索引 1 到索引 2,包含 2 个元素。 - Cap:新切片的容量为
4
,计算方式为原切片的容量5
减去新切片的起始索引1
。