跳到主要内容

Go 语言中切片的声明初始化和操作详解

· 阅读需 2 分钟
素明诚
Full stack development

声明切片变量

声明:当声明一个切片变量如 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