Go中slice的使用
//切片并不是数组或数组指针,它通过内部指针和相关属性引用数组片段,以实现变长的方案。
//slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度。
//slice和数组的区别:声明数组时,方括号内写明了数组的长度或使用...自动计算长度,而声明slice时,方括号内没有任何字符。
slice和数组的区别:声明数组时,方括号内写明了数组的长度或使用...自动计算长度,而声明slice时,方括号内没有任何字符。
第二:注意:make只能创建slice、map和channel,并且返回一个有初始值(非零)。
操作
含义
s[n]
切片s中索引位置为n的项
s[:]
从切片s的索引位置0到len(s)-1处所获得的切片
s[low:]
从切片s的索引位置low到len(s)-1处所获得的切片
s[:high]
从切片s的索引位置0到high处所获得的切片,len=high
s[low:high]
从切片s的索引位置low到high处所获得的切片,len=high-low
s[low:high:max]
从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low
len(s)
切片s的长度,总是<=cap(s)
cap(s)
切片s的容量,总是>=len(s)
示例说明:
array:=[]int{0,1,2,3,4,5,6,7,8,9}
操作
结果
len
cap
说明
array[:6:8]
[0 1 2 3 4 5]
6
8
省略 low
array[5:]
[5 6 7 8 9]
5
5
省略 high、 max
array[:3]
[0 1 2]
3
10
省略 high、 max
array[:]
[0 1 2 3 4 5 6 7 8 9]
10
10
全部省略
第三:切片和底层数组关系
s:=[]int{0,1,2,3,4,5,6,7,8,9}
s1:=s[2:5]//[234]
s1[2]=100//修改切片某个元素改变底层数组
fmt.Println(s1,s)//[23100][012310056789]
s2:=s1[2:6]//新切片依旧指向原底层数组[100567]
s2[3]=200
fmt.Println(s2)//[10056200]
fmt.Println(s)//[01231005620089]
第四,slice的内建函数append和copy的使用
1) append
append函数向 slice 尾部添加数据,返回新的 slice 对象:
vars1[]int//创建nil切换
//s1:=make([]int,0)
s1=append(s1,1)//追加1个元素
s1=append(s1,2,3)//追加2个元素
s1=append(s1,4,5,6)//追加3个元素
fmt.Println(s1)//[123456]
s2:=make([]int,5)
s2=append(s2,6)
fmt.Println(s2)//[000006]
s3:=[]int{1,2,3}
s3=append(s3,4,5)
fmt.Println(s3)//[12345]
append函数会智能地底层数组的容量增长,一旦超过原底层数组容量,通常以2倍容量重新分配底层数组,并复制原来的数据:
funcmain(){
s:=make([]int,0,1)
c:=cap(s)
fori:=0;i<50;i++{
s=append(s,i)
ifn:=cap(s);n>c{
fmt.Printf("cap:%d->%d\n",c,n)
c=n
}
}
/*
cap:1->2
cap:2->4
cap:4->8
cap:8->16
cap:16->32
cap:32->64
*/
}
2) copy
函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 可指向同⼀底层数组。
data:=[...]int{0,1,2,3,4,5,6,7,8,9}
s1:=data[8:]//{8,9}
s2:=data[:5]//{0,1,2,3,4}
copy(s2,s1)//dst:s2,src:s1
fmt.Println(s2)//[89234]
fmt.Println(data)//[8923456789]
第五,切片作为函数的参数使用。
functest(s[]int){//切片做函数参数
s[0]=-1
fmt.Println("test:")
fori,v:=ranges{
fmt.Printf("s[%d]=%d,",i,v)
//s[0]=-1,s[1]=1,s[2]=2,s[3]=3,s[4]=4,s[5]=5,s[6]=6,s[7]=7,s[8]=8,s[9]=9,
}
fmt.Println("\n")
}
funcmain(){
slice:=[]int{0,1,2,3,4,5,6,7,8,9}
test(slice)
fmt.Println("main:")
fori,v:=rangeslice{
fmt.Printf("slice[%d]=%d,",i,v)
//slice[0]=-1,slice[1]=1,slice[2]=2,slice[3]=3,slice[4]=4,slice[5]=5,slice[6]=6,slice[7]=7,slice[8]=8,slice[9]=9,
}
fmt.Println("\n")
}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。