在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中。