Go 语言切片(Slice)


Go语言切片(Slice)

定义

切片是Go语言中一种很常用的数据结构,它类似于数组,但不同之处在于切片长度是可变的。切片的底层数据结构是数组,但是切片不需要指定长度,这一点和Python 中的列表类似。

切片定义的一般语法:

var slice []T

其中,T 表示切片中元素的类型。

切片与数组的不同之处

  1. 声明语法不同

数组的定义方式为:

var arr [5]int

而切片的定义方式为:

var slice []int
  1. 长度不同

数组的长度是固定的,在数组定义时就指定了,而切片是可以动态改变长度的,长度是可以随时增加或者减少的。

  1. 维护数据的内存不同

在定义数组的时候,数组的内存就已经分配好了,不管数组中存了几个数据,数组的长度是不变的。而切片内部的内存结构是基于数组的,但是切片却不需要预定义长度,因此切片能够动态增加或缩减。

  1. 传递方式不同

当数组作为参数传递给函数时,实际上传递的是数组的一个副本,而切片在传递时,传递的是指针,也就是实际传递的是底层数组的一部分,因此切片在传递时比较高效。

切片的操作

切片的生成

切片的生成有多种方式,如下:

使用数组生成

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函数等多种方式来实现,同时切片还支持多种操作,包括添加、删除、查询、循环和比较等。