在Go语言中,切片(slice)是对数组的一种抽象,它提供了一种动态长度的、可调整大小的数据结构。切片底层依赖于数组,并包含三个元素:指向底层数组的指针、切片的长度和切片的容量。
切片的内部实现
切片的内部结构可以表示为slice struct { array *T; len, cap int },其中array是指向底层数组的指针,len表示切片当前的长度,cap表示底层数组的容量。
当创建一个切片时,可以通过make([]T, length, capacity)函数来初始化,其中T是切片的数据类型,length是切片的长度,capacity是底层数组的容量。这个函数会分配一个底层数组,并返回一个包含指向该数组指针、长度和容量的切片。
切片的基本功能
创建切片
可以通过字面量、make()函数或者切割数组或切片来创建切片。
示例:
// 使用字面量创建切片 var s1 = []int{1, 2, 3, 4, 5}
// 使用make()函数创建切片 var s2 = make([]int, 5, 10)
// 切割数组或切片创建切片 var a = []int{1, 2, 3, 4, 5} s3 := a[1:3] // s3 := []int{2, 3}
切片的长度和容量
可以使用len()和cap()函数来获取切片的长度和容量。
示例:
s := []int{1, 2, 3} fmt.Println(len(s)) // 输出: 3 fmt.Println(cap(s)) // 输出: 3
切片的截取和拼接
可以使用切片的截取操作符[:]来截取原切片的一部分,也可以使用append()函数来拼接两个切片。
示例:
s1 := []int{1, 2, 3} s2 := []int{4, 5, 6} s3 := s1[:2] // s3 := []int{1, 2} s4 := append(s1, s2...) // s4 := []int{1, 2, 4, 5, 6}
切片的切割和扩展
可以使用切片的切割操作符[low:high]来切割原切片的一部分,也可以使用copy()函数来扩展原切片的容量并赋值给新的切片。
示例:
s := []int{1, 2, 3, 4, 5} s1 := s[1:3] // s1 := []int{2, 3} s2 := make([]int, 3) copy(s2, s[:2]) // s2 := []int{1, 2},原切片s的前两个元素被复制到新切片s2中。