# 7.4 切片重组

我们已经知道 slice 创建的时候通常比相关数组小，例如

	slice1 := make([]type, start_length, capacity)

其中 start_length 作为 slice 初始长度而 capacity 作为相关数组的长度。

这么做的好处是我们的 slice 在达到容量上限后可以扩容。改变 slice 长度的过程称之为切片重组 **reslicing**，做法如下：`slice1 = slice1[0:end]`，其中 end 是新的末尾索引（即长度）。

将 slice 扩展 1 位可以这么做：`sl = sl[0:len(sl)+1]`

slice 可以反复扩展直到占据整个相关数组。


示例 7.11 [reslicing.go](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 是一个 slice，那么 s[n:n] 的长度是多少？

2) s[n:n+1] 的长度又是多少？          

## 链接

- [目录](directory.md)
- 上一节：[For-range 结构](07.3.md)
- 下一节：[切片的复制与追加](07.5.md)
