多应用+插件架构,代码干净,支持一键云编译,码云点赞13K star,4.8-4.12 预售价格198元 广告
我们已经知道切片创建的时候通常比相关数组小,例如: ~~~ 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](https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/examples/chapter_7/reslicing.go) ~~~ package main import "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] = i fmt.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 1 The length of slice is 2 The length of slice is 3 The length of slice is 4 The length of slice is 5 The length of slice is 6 The length of slice is 7 The length of slice is 8 The length of slice is 9 The length of slice is 10 Slice at 0 is 0 Slice at 1 is 1 Slice at 2 is 2 Slice at 3 is 3 Slice at 4 is 4 Slice at 5 is 5 Slice at 6 is 6 Slice at 7 is 7 Slice at 8 is 8 Slice 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]` 的长度又是多少?