Go 语言切片(Slice)
Go语言切片(Slice)
定义
切片是Go语言中一种很常用的数据结构,它类似于数组,但不同之处在于切片长度是可变的。切片的底层数据结构是数组,但是切片不需要指定长度,这一点和Python 中的列表类似。
切片定义的一般语法:
var slice []T
其中,T 表示切片中元素的类型。
切片与数组的不同之处
- 声明语法不同
数组的定义方式为:
var arr [5]int
而切片的定义方式为:
var slice []int
- 长度不同
数组的长度是固定的,在数组定义时就指定了,而切片是可以动态改变长度的,长度是可以随时增加或者减少的。
- 维护数据的内存不同
在定义数组的时候,数组的内存就已经分配好了,不管数组中存了几个数据,数组的长度是不变的。而切片内部的内存结构是基于数组的,但是切片却不需要预定义长度,因此切片能够动态增加或缩减。
- 传递方式不同
当数组作为参数传递给函数时,实际上传递的是数组的一个副本,而切片在传递时,传递的是指针,也就是实际传递的是底层数组的一部分,因此切片在传递时比较高效。
切片的操作
切片的生成
切片的生成有多种方式,如下:
使用数组生成
arr := [10]int{1,2,3,4,5,6,7,8,9,0}
slice := arr[2:5] // 获取arr数组下标从2到4的切片
使用make函数生成
// 语法:make([]T, length, capacity)
// 其中,capacity 表示分配的容量(可选项)
slice := make([]int, 5)
直接定义
var slice []int
slice = append(slice, 1)
切片的长度和容量是不同的,切片的容量确定切片最多可容纳多少元素,而切片的长度表示当前切片中已经存储的元素个数。可以使用len函数和cap函数获取切片的长度和容量。
a := []int{1,2,3,4,5,6,7,8,9,0}
println(len(a)) //输出10
println(cap(a)) //输出10
注意
当一个切片通过append函数添加元素时,如果当前切片的容量不够,Go语言就会重新分配内存,扩大为当前切片容量的两倍,并把已有的元素拷贝过去。
切片的操作
添加
可以使用append函数来实现切片的添加。
a := []int{1,2,3}
a = append(a, 4,5) //添加两个元素4和5
删除
Go语言中删除切片元素使用内置函数copy。
a := []int{1,2,3,4,5}
a = append(a[:2], a[3:]...)
//切掉了第3个元素
查询
可以使用切片的下标来查询特定位置的元素。
a := []int{1,2,3,4,5}
println(a[1]) //输出2
切片的循环
使用for循环来遍历切片。
a := []int{1,2,3,4,5}
for _, num := range a {
println(num)
}
切片的比较
使用reflect.DeepEqual()函数来判断两个切片是否相等。
a := []int{1,2,3}
b := []int{1,2,3}
if reflect.DeepEqual(a, b) {
println("a和b相等")
}
总结
切片是Go语言中非常常见的数据结构,与数组不同的是,切片的长度是可变的。切片可以动态增加或者缩减,同时切片传递的是指针,比较高效。切片的生成可以通过数组,make函数等多种方式来实现,同时切片还支持多种操作,包括添加、删除、查询、循环和比较等。