Go切片(Slice)是Go数组的一个抽象。 由于Go数组允许定义类型的变量,可以容纳相同数据类型的几个数据项,但它不提供任何内置的方法来动态增加其大小或获取自己的子数组。切片就没有这样的限制。 它提供了数组所需的许多实用功能,并广泛用于Go编程。

定义切片

varnumbers[]int/*未指定大小*//*numbers==[]int{0,0,0,0,0}*/numbers=make([]int,6,6)/*长度是6容量是6的切片*/

len() 和 cap()函数

因为切片(Slice)是数组上的抽象。 它实际上使用数组作为底层结构体.len()函数返回切片中存在的元素数量,其中cap()函数返回切片(Slice)的容量(大小),即可容纳多少个元素。 以下是解释切片(Slice)的用法的示例:

packagemainimport"fmt"funcmain(){varnumbers=make([]int,3,5)printSlice(numbers)}funcprintSlice(x[]int){fmt.Printf("len=%dcap=%dslice=%v\n",len(x),cap(x),x)}

当上述代码编译和执行时,它产生以下结果:

len=3cap=5slice=[000]

Nil切片

如果缺省情况下声明没有输入切片,则将其初始化为nil。 其长度和容量为零。 以下是一个示例:

packagemainimport"fmt"funcmain(){varnumbers[]intprintSlice(numbers)if(numbers==nil){fmt.Printf("sliceisnil")}}funcprintSlice(x[]int){fmt.Printf("len=%dcap=%dslice=%v\n",len(x),cap(x),x)}

当上述代码编译和执行时,它产生以下结果:

len=0cap=0slice=[]sliceisnil

子切片

切片(Slice)允许指定下界和上界,以使用[下限:上限]获取它的子切片。 以下是示例:

packagemainimport"fmt"funcmain(){/*创建切片*/numbers:=[]int{0,1,2,3,4,5,6,7,8}printSlice(numbers)/*打印这个切片*/fmt.Println("numbers==",numbers)/*打印子切片[1,4),前闭后开*/fmt.Println("numbers[1:4]==",numbers[1:4])/*没有下限,默认0*/fmt.Println("numbers[:3]==",numbers[:3])/*没有上限,默认切片的len*/fmt.Println("numbers[4:]==",numbers[4:])numbers1:=make([]int,0,5)printSlice(numbers1)/*打印子切片0到2*/number2:=numbers[:2]printSlice(number2)/*打印子切片2到5*/number3:=numbers[2:5]printSlice(number3)}funcprintSlice(x[]int){fmt.Printf("len=%dcap=%dslice=%v\n",len(x),cap(x),x)}

当上述代码编译和执行时,它产生以下结果:

len=9cap=9slice=[012345678]numbers==[012345678]numbers[1:4]==[123]numbers[:3]==[012]numbers[4:]==[45678]len=0cap=5slice=[]len=2cap=9slice=[01]len=3cap=7slice=[234]

append()和copy()函数

切片(Slice)允许使用append()函数增加切片的容量(大小)。使用copy()函数,将源切片的内容复制到目标切片。以下是示例:

packagemainimport"fmt"funcmain(){varnumbers[]intprintSlice(numbers)/*添加空元素到切片*/numbers=append(numbers,0)printSlice(numbers)/*添加一个元素到切片*/numbers=append(numbers,1)printSlice(numbers)/*添加多个元素*/numbers=append(numbers,2,3,4)printSlice(numbers)/*新建一个切片,容量增加到原来的两倍*/numbers1:=make([]int,len(numbers),(cap(numbers))*2)/*拷贝numbers到numbers1*/copy(numbers1,numbers)printSlice(numbers1)}funcprintSlice(x[]int){fmt.Printf("len=%dcap=%dslice=%v\n",len(x),cap(x),x)}

当上述代码编译和执行时,它产生以下结果:

len=0cap=0slice=[]len=1cap=2slice=[0]len=2cap=2slice=[01]len=5cap=8slice=[01234]len=5cap=16slice=[01234]