Files
the-way-to-go_ZH_CN/eBook/07.4.md
2015-07-30 19:37:40 +08:00

90 lines
2.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 7.4 切片重组reslice
我们已经知道切片创建的时候通常比相关数组小,例如:
```go
slice1 := make([]type, start_length, capacity)
```
其中 `start_length` 作为切片初始长度而 `capacity` 作为相关数组的长度。
这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 **reslicing**,做法如下:`slice1 = slice1[0:end]`,其中 end 是新的末尾索引(即长度)。
将切片扩展 1 位可以这么做:
```go
sl = sl[0:len(sl)+1]
```
切片可以反复扩展直到占据整个相关数组。
示例 7.11 [reslicing.go](examples/chapter_7/reslicing.go)
```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
另一个例子:
```go
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 重新分片:
```go
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]` 的长度又是多少?
## 链接
- [目录](directory.md)
- 上一节:[For-range 结构](07.3.md)
- 下一节:[切片的复制与追加](07.5.md)