Go 语言中的 Slice 类型
Slice(切片)是 Go 语言内置的可变长度序列,属于引用类型,基于底层数组封装实现,解决数组长度固定、数组传参完整拷贝开销大的问题,是 Go 开发最常用的数据结构之一。 1. Slice 的基础特性 可变长度:长度不固定,可通过 append 动态追加元素。 底层数组共享:切片本身不存储实际元素,元素存放在底层数组;多个切片可以指向同一个底层数组,修改会互相影响。 len 与 cap 分离:len代表切片当前可用元素个数;cap代表底层数组允许的最大容量。 零值特性:切片零值为 nil,nil slice len=0、cap=0;nil slice 和空切片 []int{} 不相等。 引用语义:切片变量存储的是结构体头信息,赋值、传参拷贝的是切片头,不是底层数组。 不可直接比较:切片不能使用 == 判断两个切片内容是否相等,仅允许和 nil 做相等判断。 友情提示 上述特性与 Slice 的底层实现紧密关联,建议结合第 4 节"Slice 底层实现原理"章节阅读,以获得更深入的理解。 2. Slice 的四种初始化方式 切片必须初始化,nil切片可以读取、append,但不能直接对索引位置赋值。 2.1 声明未初始化(nil slice) 仅定义变量,底层数组指针为 nil,len=0、cap=0。 // 声明nil切片,未分配底层数组 var a []string fmt.Println(a == nil) // true fmt.Println(len(a), cap(a)) // 0 0 // a[0] = "hello" // 未初始化的切片直接赋值会引发 panic // panic: index out of range 2.2 字面量初始化(空切片/带初始值) 直接初始化,分配底层数组,支持空切片和预设元素。 ...