数组的长度在Go语言中是不能改变的,但是在很多应用场景中,数组在初始定义的时候,数组的长度是不可预知的,这样的序列集是不能满足要求的。Go提供了另一种内置的类型切片,弥补了数组的缺陷。从底层开始,切片引用数组中的对象。可以将元素附加到切片上,这可能会增加切片的容量。与数组相比,切片不需要设置长度,也不需要在[]中设置值,相对自由。
2.切片声明使用2.1 通过make//使用make()函数创建切片 Varslice1 = make ([] int,3) slice 1[0]= 1 slice 1[1]= 2 slice 1[2]= 4[/h]传递make关键字[slice 1]类型:%T值:% v n & # 34,slice1,slice1) //输出:直接初始化 Slice2: =通过使用make关键字[slice 1]type:[]int value:[1 2 4] 2.2。使用[slic2]类型进行直接初始化:%T值:% v n & # 34,slice2,slice2) /output:直接初始化使用[slic 2]type:[]int value:[1 2 4] 2.3 Interceptpackage main import & # 34;fmt & # 34 func main() { //定义一个数组 arr: = [...] int {1,2,4,6,8,10,12,14,16 } /从索引0开始。从索引0剪切到索引4(不包括4)[slice3]类型:%T值:% v n & # 34,slice3,slice3) //当索引从0开始时,0也可以省略写入 slice 33:= arr[:4] fmt . printf(& # 34;从索引0剪切到索引4(不包括4)[slice33]类型:%T值:% v n & # 34,Slice33,slice 33) /从索引4切到结尾 slice 4:= arr[5:] fmt . printf(& # 34;从索引5剪切到最后一个[slice4]类型:%T值:% v n & # 34,slice4,Slice4) } /**输出 从索引0截断到索引4(不含4)[slice3]类型:[]int值:[1 2 4 6] 从索引0截断到索引4(不含4)[Slice 4]类型:[]int值:[10 12 14 16] */ 3 .切片删除 3.1删除第一个元素包主[fmt & # 34; func main() { //定义一个slice slice: = [] int {1,2,3,4,5,6 } fmt . printf(& # 34;切片->;值:%v长度:%d长度:% dn & # 34,slice,len (slice),cap(slice)) /删除第一个元素 slice = slice[1:] fmt . printf(& # 34;删除元素后-& gt;值:%v长度:%d长度:% dn & # 34,slice,len (slice),cap(slice)) } /* Output slice slice-->删除一个元素后:Value:[1 2 3 4 5 6]len:6 cap:6 -& gt;value:[2 3 4 5 6]len:5 cap:5 */ 3.2删除最后一个元素包Main import & # 34;fmt & # 34 func main() { //定义一个slice slice: = [] int {1,2,3,4,5,6 } fmt . printf(& # 34;切片->;值:%v长度:%d长度:% dn & # 34,slice,len (slice),cap(slice) /删除最后一个元素 slice = slice[:len(slice)-1] fmt . printf(& # 34;删除元素后-& gt;值:%v长度:%d长度:% dn & # 34,slice,len (slice),cap(slice)) } /* Output slice slice-->删除一个元素后:Value:[1 2 3 4 5 6]len:6 cap:6 -& gt;value:[1 2 3 4 5]len:5 cap:6 */ 3.3删除指定位置元素包Main Import & # 34;fmt & # 34 func main() { //定义一个slice slice: = [] int {1,2,3,4 } fmt . printf(& # 34;切片->;值:%v长度:%d长度:% dn & # 34,slice,len(slice),Cap(slice) index:= 2 //指定索引的前部 Front:= slice[:index] /指定索引的后部 Behind: = slice [index+1:]删除索引% d-& gt;值:%v长度:%d长度:% dn & # 34,index,slice,len (slice),cap (slice)) } 4。Len()和cap () 4.1切片的长度是切片中元素的个数。切片的容量是从切片索引开始的基础数组中的元素数量。切片可以通过len()方法得到长度,通过cap()方法得到容量。cap()的数组计算结果与len()的结果相同。

包主 导入& # 34;fmt & # 34 func main() { //创建切片 slice: = [] int {1,2,4,6,8,10,12,14,16} fmt.printf (& Slice,len:% d cap:% d n & # 34;,len (slice),cap(Slice)) //Qing空Slice 1 Slice 1:= Slice[0:0] FMT。printf ( 39 Slice1,len:% d cap:% d n & # 34;,len (Slice1),cap(slice 1)) /使用make指定创建切片的容量 VarSlice2 = make ([] int,4,8) Slice2 [1] = 1 Slice2,len:% d cap:% d n & # 34;,len (slice2),cap(slice 2)) //数组。计算cap()的结果和len () arr: = [...] int {1,2,4,6,8,10,12,arr数组,len:% d cap:% d n & # 34;,len (arr),cap (arr)) } /* *输出: slice slice,len:9 cap:9 slice slice 1,len:0 cap:9 slice slice slice它只是对底层数组的引用。对切片所做的任何更改都将反映在基础数组中。是数组值类型,而切片是引用类型。
5.1 函数传参包主 导入& # 34;fmt & # 34 functest slice(slice[]int){ //修改slice slice[0]= 100 } funcmain(){ //创建一个切片。变量片的类型:% t内存地址:%p值:% v n & # 34,slice,& slice,slice) /调用函数修改 测试切片(slice) fmt . printf(& # 34;调用函数后,变量切片类型:% t内存地址:% p值:% v n & # 34,slice,& slice,slice) } /* *输出 可变切片类型:[]int内存地址:0xc00000c080值:[1 2 3 4] 调用函数后,可变切片类型:[]int内存地址:0xc00000c080值:[100 2 3 4] */ 5.2多切片共享修改切片值。当多个切片共享同一基础数组时,对每个元素所做的更改将反映在数组中。
包主
导入& # 34;fmt & # 34
functest slice(slice[]int){
//修改slice
slice[0]= 100
}
funcmain(){
//创建一个切片。变量片的类型:% t内存地址:%p值:% v n & # 34,slice,&slice,slice)
//到另一个切片
slice copy:= slice
fmt . printf(& # 34;变量sliceCopy的类型:% t内存地址:%p值:% v n & # 34,切片复制,&切片复制,切片复制)
/Cut
slice 2:= slice[0:2]
fmt . printf(& # 34;变量slice2的类型:% t内存地址:%p值:% v n & # 34,Slice2,& Slice2,slice 2)
/调用函数修改
测试切片(slice)
fmt . printf(& # 34;调用函数后-变量切片类型:% t内存地址:% p值:% v n & # 34,切片,&切片,切片)
fmt。printf(& # 34;调用函数变量sliceCopy类型:% t内存地址:%p值:% v n & # 34,sliceCopy,&sliceCopy,sliceCopy)
fmt。printf(& # 34;调用函数变量slice2类型:% t内存地址:%p值:% v n & # 34,Slice2,& Slice2,Slice2)
}
6。Append()和Copy () 6.1函数append():用于向切片添加新元素。 包主
导入& # 34;fmt & # 34
functest slice(slice[]int){
//修改切片值
slice[0]= 100
}
funcmain(){
//定义切片类型。0,4)
//向slice
Slice1: = append (slice,1)
fmt . printf(& # 34;变量slice 1-value:% v length(len):% d capacity(cap):% d address:% p n & # 34;,
Slice1,len (Slice1),cap (Slice1),& slice 1)
//将多个元素(不超过容量)添加到切片
Slice2: = append (Slice3,4,5)变量slice 2-value:% v length(len):% d capacity(cap):% d address:% p n & # 34;,
Slice2,len (Slice2),cap (Slice2),& slice 2)
//添加一个切片(超出容量)到slice
new slice: = [] int {1,2,3,变量slice 3-value:% v len:% d capacity(cap):% d address:% p n & # 34;,
Slice3,Len (Slice3),Cap (Slice3),& slice 3)
/调用函数修改
测试切片(Slice1)
fmt.printf ( 34调用函数后-变量slice 1-value:% v length(Len):% d capacity(Cap):% d address:% p n & # 34;,
slice1,len(slice1),cap(slice1),&slice1 )
fmt。printf(& # 34;调用函数后-变量slice 2-value:% v length(len):% d capacity(cap):% d address:% p n & # 34;,
slice2,len(slice2),cap(slice2),&slice2 )
fmt。printf(& # 34;调用函数后-变量slice3 -值:%v长度(len):%d容量(cap): %d地址:% p n & # 34,
slice3,len(slice3),cap(slice3), &slice3 )
}
/**输出
变量slice1 -值:[1]长度(len):1容量(cap): 4地址:0xc00000c080
变量slice2 - : 4地址:0xc 0000 c 00
变量slice3 -值:[1 2 3 4 5 6 7]长度(len):7容量(cap): 8地址:0xc00000c100
h/]调用函数后 调用函数后-变量slice 3-value::7 Capacity(cap):8 Address:0xc 00000 c 100
*/
append()会改变切片引用的数组的内容,从而影响引用同一数组的其他切片。 当append()用于向切片追加元素时,如果容量不足(即(cap-len) == 0),Go会创建一个新的内存地址来存储元素。 包主
导入& # 34;fmt & # 34
func main() {
//定义一个slice
slice: = [] int {1,2,3,4 }
fmt . printf(& # 34;可变切片值:%v长度(len):%d容量(cap): %d地址:% p n & # 34,
slice,len (slice),cap (slice),& slice)
//定义一个slice变量来复制slice
copy slice:= make([]int,8)
[副本数:% d n & # 34,计数)
fmt。printf(& # 34;变量copy slice-value:% v length(len):% d capacity(cap):% d address:% p n & # 34;,
copyslice,len (copyslice),cap (copyslice),slice)
//修改复制的切片,源切片不变
copy slice[0]= 100
fmt . print .修改后-& gt;可变切片值:%v长度(len):%d容量(cap): %d地址:% p n & # 34,
slice,len(slice),cap(slice),&slice )
fmtprintf(& # 34;修改后->;变量copy slice-value:% v length(len):% d capacity(cap):% d address:% p n & # 34;,
copySlice,len(copySlice),cap(copySlice),Slice)
}
/* *输出
可变slice - Value: [1 2 3 4]长度(len):4容量(cap): 4地址:0xc00000c080
副本数:4 [/]可变slice - value: [1 2 3 4]长度(len):4容量(cap): 4地址:0xc00000c080
修改后->: CopySlice[自鸣得意]








