切片常见操作
切片是 Go 语言中常用的数据结构之一,具有灵活的长度和容量。下面介绍一些常见的切片操作:
- 创建切片
创建切片可以使用 make
函数或者直接使用切片字面量。例如:
// 使用 make 函数创建长度为 5,容量为 10 的整型切片
s := make([]int, 5, 10)
// 直接创建整型切片
s := []int{1, 2, 3, 4, 5}
- 切片截取
切片可以通过下标进行截取,即获取原切片的一部分。例如:
// 创建一个包含 5 个元素的整型切片
s := []int{1, 2, 3, 4, 5}
// 截取从下标 1 开始,到下标 3 结束(不包括下标 3)的子切片
sub := s[1:3]
fmt.Println(sub) // [2 3]
- 切片追加
切片可以使用 append
函数追加元素。如果追加的元素个数超过了切片的容量,那么会重新分配更大的内存空间。例如:
s1 := []int{1, 2, 3}
s2 := []int{4, 5, 6}
// 将 s2 中的元素追加到 s1 中,并返回新的切片
s3 := append(s1, s2...)
fmt.Println(s3) // [1 2 3 4 5 6]
- 切片复制
切片可以使用 copy
函数进行复制。该函数会将源切片的元素复制到目标切片中,如果目标切片的长度不足,只会复制到目标切片的长度为止。同时要注意copy的参数必须是 slice 不能是数组,所以如果数组a要使用copy,则需要传递a[:]。例如:
// 创建源切片和目标切片
src := []int{1, 2, 3}
dst := make([]int, 2)
// 复制源切片中的元素到目标切片中
n := copy(dst, src)
fmt.Println(n, dst) // 2 [1 2]
- 切片遍历
切片可以使用 for
循环进行遍历。例如:
s := []int{1, 2, 3}
for i, v := range s {
fmt.Println(i, v)
}
上面的代码中,使用 range
关键字遍历切片 s
,获取每个元素的下标和值,并打印出来。
- 切片长度和容量
切片的长度和容量可以使用 len
和 cap
函数获取。其中,长度表示切片中元素的个数,容量表示切片底层数组的长度。例如:
s := make([]int, 5, 10)
fmt.Println(len(s), cap(s)) // 5 10
``
- 判断切片是否相等
判断切片是否相等需要遵循以下规则:- 切片只能与
nil
比较相等,不能与其他类型的数据比较; - 切片相等的条件是:长度相等,所有元素都相等。
- 切片只能与
下面是一个示例代码,用于判断两个整型切片是否相等:
func equal(a, b []int) bool {
if len(a) != len(b) {
return false
}
for i, v := range a {
if v != b[i] {
return false
}
}
return true
}
func main() {
s1 := []int{1, 2, 3}
s2 := []int{1, 2, 3}
s3 := []int{3, 2, 1}
fmt.Println(equal(s1, s2)) // true
fmt.Println(equal(s1, s3)) // false
}
上面的代码中,equal
函数用于判断两个整型切片是否相等,如果长度不等或者元素不等,则返回 false
。在 main
函数中,我们测试了两个相等的切片 s1
和 s2
,以及一个不相等的切片 s3
。其中,s1
和 s2
是相等的,因为它们长度相等,元素也都相等,而 s3
与 s1
不相等,因为它们的元素顺序不同。