切片是什么意思网络用语(Go学习(十):切片)

1.切片的概念

数组的长度在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()的结果相同。

切片是什么意思

4.2 使用

包主 导入& # 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():用于向切片添加新元素。

  • Copy():将不会建立源切片和目标切片之间的关系。即两个切片之间没有联系,一个切片的修改不影响另一个切片。
  • 6.2 使用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会创建一个新的内存地址来存储元素。

    6.3 使用copy()

    包主 导入& # 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[自鸣得意]

    您可以还会对下面的文章感兴趣

    使用微信扫描二维码后

    点击右上角发送给好友