我们已经知道切片创建的时候通常比相关数组小,例如:
slice1 := make([]type, start_length, capacity)
其中 start_length
作为切片初始长度而 capacity
作为相关数组的长度。
这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 reslicing,做法如下:slice1 = slice1[0:end]
,其中 end 是新的末尾索引(即长度)。
将切片扩展 1 位可以这么做:
sl = sl[0:len(sl)+1]
切片可以反复扩展直到占据整个相关数组。
示例 7.11 reslicing.go
package mainimport "fmt"func main() {slice1 := make([]int, 0, 10)// load the slice, cap(slice1) is 10:for i := 0; i < cap(slice1); i++ {slice1 = slice1[0:i+1]slice1[i] = ifmt.Printf("The length of slice is %d\n", len(slice1))}// print the slice:for i := 0; i < len(slice1); i++ {fmt.Printf("Slice at %d is %d\n", i, slice1[i])}}
输出结果:
The length of slice is 1The length of slice is 2The length of slice is 3The length of slice is 4The length of slice is 5The length of slice is 6The length of slice is 7The length of slice is 8The length of slice is 9The length of slice is 10Slice at 0 is 0Slice at 1 is 1Slice at 2 is 2Slice at 3 is 3Slice at 4 is 4Slice at 5 is 5Slice at 6 is 6Slice at 7 is 7Slice at 8 is 8Slice at 9 is 9
另一个例子:
var ar = [10]int{0,1,2,3,4,5,6,7,8,9}var a = ar[5:7] // reference to subarray {5,6} - len(a) is 2 and cap(a) is 5
将 a 重新分片:
a = a[0:4] // ref of subarray {5,6,7,8} - len(a) is now 4 but cap(a) is still 5
问题 7.7
1) 如果 a 是一个切片,那么 s[n:n]
的长度是多少?
2) s[n:n+1]
的长度又是多少?
目录
上一节:For-range 结构
下一节:切片的复制与追加