golang切片(v21.8.3)
为什么用切片
1.数组容量固定,不能自动扩展
2.值传递,数组作为函数参数时,将整个数组值拷贝一份给形参
3.在golang中,切片可以完美替代数组
切片的本质
1.它不是一个数组的指针,是一种数据结构体,用来操作数组内部元素
2.在runtine/slice.go ,可以看出切片是种特殊的结构体
type slice struct{
*p
len
cap
}
切片的基础组成
arr[1:3:5]
切片名称[low:high:max]
low:起始下标位置
high:结束下标位置 len=high-low
容量cap: cap=max-low
arr[1:3]
切片名称[low:high]
切片截取数组,容量跟随原数组
arr[:3:5]
从0开始,到high结束(不包含)
arr[low:]
从low开始,到末尾
arr[:high]
从0开始,到high结束,容量跟随原先容量
arr:= [ 10 ] int { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 }
s:= arr[ 1 : 5 : 7 ]
s= [ 2 , 3 , 4 , 5 ]
len ( s) = 4
cap ( s) = 6
s1:= s[ 0 : 6 ]
s1= [ 2 , 3 , 4 , 5 , 6 , 7 ]
len ( s1) = 6
cap ( s1) = 6
s2 := arr[ 2 : 7 ]
len ( s2) = 5
cap ( s2) = 8
s3 := s2[ 2 : 7 ]
len ( s3) = 5
cap ( s3) = 6
切片的创建
1.自动推导 slice:=[]int{1,2,3,4,5}
2.slice:=make([]int,长度,容量)
3.slice:=make([]int,长度) //创建切片时,没有指定容量的,容量=长度
注意:make只能穿件slice,map和channel,并且返回一个有初始值(非零)的对象
切片作函数参数–(传地址)实际还是值传递
golan传参只有值传递!
切片常用函数
1.append()
append(切片对象,待追加元素)
追加的时候,如果切片容量没有满,那么就把追加元素追到后面
如果切片容量满了,扩充时容量小于1024时,那么以两倍的方式增加,例如当前切片容量999,满了继续append,那么容量变为1998,接下来按照某种算法扩展大小
2.copy
部分坑
https://www.jianshu.com/p/be07bee40b08
copy(dst,src []Type)
它表示把切片 src 中的元素拷贝到切片 dst 中,返回值为拷贝成功的元素个数。如果 src 比 dst 长,就截断;如果 src 比 dst 短,则只拷贝 src 那部分:
str=[]string{"a","b","c","d","e"}
copy(str[3:],str[4:]) //内容是将str[4:]的内容覆盖到str[3:]
结果变为 [a,b,c,e,e]