切片是一个引用类型
1.字面量方式声明切片
slice := []int{1,2,3,4,5}//长度和容量为5
2.使用make()
函数
slice := make([]int,0) //长度和容量为0
newSlice := make([]int,0,5) //长度为0,容量为5
使用make函数创建切片时,长度代表切片的长度,容量指向底层一个长度为5的数组
计算切片长度和容量:
slice := []int{10, 20, 30, 40, 50}
newSlice := slice[1:3]
长度: j - i
容量: k - i
对于newSlice来说,他的长度和容量如下:
长度:3 - 1 = 2
容量: 5 - 1 = 4
上面的示例中,3代表原数组索引3的位置,5代表原数组的长度。虽然newSlice的长度为4,但是他仍然无法访问后两位索引值 (除了再次对它进行切片处理)。newSlice即使被slice分配切片,但是它们俩的底层数组是进行共享的。当newSlice被改变时,slice也会被改变。
接着上面所说,newSlice被分配后结果为:[20,30],虽然此时容量为4,但是无法访问40和50这两个值,所以要对切片重新进行切片:newSlice = newSlice[:cap(newSlice)]
,这相当于newSlice[:4]
,也就是获取0~容量值结束.[20,30,40,50]
如果我想删除掉最后一个值:newSlice = newSlice[:len(newSlice)-1]
,相当于[:4-1=3] === [20,30,40]
len-1等于是长度4-1等于3,因为获取的总是start ~ end-1的值.len-1还原了索引值,因为长度是从1开始计算。如果一个切片长度为5,那么想获取最后一位就是len-1也就是5-1=4 .index是从0,1,2,3,4
刚好是长度为5
3.另一种声明方式
source := []string{"Apple", "Orange", "Plum", "Banana", "Grape"}
slice := source[2:3:4] //长度为1,容量为2
这种方式可以利用上面的公式:
对于slice [i:j,k]
或[2:3:4]
长度:j - 1 或 3 - 2 = 1
容量:k - i 或 4 - 2 = 2
所以slice = [“Plum”]
如果试图设置的容量比可用的容量还大,就会得到一个语言运行时错误 :[2:3:6]
是不允许的