Go 语言中的切片(slice)是引用类型,它提供了一种灵活的方式去操作一系列具有相同类型的数据。与数组不同,切片的长度不是固定的,可以动态地增长或缩小。切片在 Go 语言中非常常用,因为它们提供了高效且方便的方式来处理数据集合。
切片的基本概念
- 切片的定义:切片是一个描述符,包含指向底层数组的指针、长度(len)和容量(cap)。长度是指切片中元素的数量,容量是从切片的第一个元素开始到数组末尾的元素数量。
- 切片的声明:使用
[]T
表示一个元素类型为T
的切片。 - 切片的创建:
- 使用
make
函数创建切片:s := make([]int, len, cap)
,其中len
是长度,cap
是容量。 - 从已存在的数组或切片创建切片:
s := arr[start:end]
,这里start
是起始索引,end
是结束索引(不包括该索引位置的元素)。
- 使用
切片的用法
-
初始化和赋值
var s []int // 声明一个切片 s = make([]int, 5) // 创建一个长度为5的切片
-
添加元素
- 使用
append
函数向切片追加元素。如果切片的容量不足以容纳新的元素,append
会自动分配更大的底层数组,并返回新的切片。s := []int{1, 2, 3} s = append(s, 4, 5) // 追加多个元素
- 使用
-
访问和修改元素
- 通过索引来访问或修改切片中的元素。
s := []int{1, 2, 3} fmt.Println(s[1]) // 输出: 2 s[1] = 100 // 修改第二个元素
- 通过索引来访问或修改切片中的元素。
-
遍历切片
- 可以使用
for
循环或者range
关键字来遍历切片。s := []int{1, 2, 3, 4, 5} for i, v := range s { fmt.Printf("索引 %d 对应的值是 %d\n", i, v) }
- 可以使用
-
切片的拷贝
- 使用
copy
函数可以将一个切片的内容复制到另一个切片中。src := []int{1, 2, 3, 4, 5} dst := make([]int, len(src)) copy(dst, src)
- 使用
-
切片的比较
- 切片不能直接进行比较(例如使用
==
或!=
),但是可以通过比较每个元素来间接实现。 - Go 1.18 版本引入了泛型,可以使用泛型函数来实现切片的比较。
- 切片不能直接进行比较(例如使用
-
多维切片
- 切片也可以是多维的,即切片的元素本身也是切片。
m := [][]int{ {1, 2, 3}, {4, 5, 6}, }
- 切片也可以是多维的,即切片的元素本身也是切片。
注意事项
- 当你传递切片给函数时,实际上传递的是切片的副本,但是这个副本仍然指向原来的底层数组。因此,在函数内部对切片的修改会影响到原始切片。
- 需要特别注意切片的容量管理,避免不必要的内存分配。