|
|
@@ -1,37 +1,44 @@
|
|
|
-# 7.4 切片重组
|
|
|
+# 7.4 切片重组(reslice)
|
|
|
|
|
|
-我们已经知道 slice 创建的时候通常比相关数组小,例如
|
|
|
+我们已经知道切片创建的时候通常比相关数组小,例如:
|
|
|
|
|
|
- slice1 := make([]type, start_length, capacity)
|
|
|
+```go
|
|
|
+slice1 := make([]type, start_length, capacity)
|
|
|
+```
|
|
|
|
|
|
-其中 start_length 作为 slice 初始长度而 capacity 作为相关数组的长度。
|
|
|
+其中 `start_length` 作为切片初始长度而 `capacity` 作为相关数组的长度。
|
|
|
|
|
|
-这么做的好处是我们的 slice 在达到容量上限后可以扩容。改变 slice 长度的过程称之为切片重组 **reslicing**,做法如下:`slice1 = slice1[0:end]`,其中 end 是新的末尾索引(即长度)。
|
|
|
+这么做的好处是我们的切片在达到容量上限后可以扩容。改变切片长度的过程称之为切片重组 **reslicing**,做法如下:`slice1 = slice1[0:end]`,其中 end 是新的末尾索引(即长度)。
|
|
|
|
|
|
-将 slice 扩展 1 位可以这么做:`sl = sl[0:len(sl)+1]`
|
|
|
+将切片扩展 1 位可以这么做:
|
|
|
|
|
|
-slice 可以反复扩展直到占据整个相关数组。
|
|
|
+```go
|
|
|
+sl = sl[0:len(sl)+1]
|
|
|
+```
|
|
|
|
|
|
+切片可以反复扩展直到占据整个相关数组。
|
|
|
|
|
|
示例 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])
|
|
|
- }
|
|
|
- }
|
|
|
+```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])
|
|
|
+ }
|
|
|
+}
|
|
|
+```
|
|
|
|
|
|
输出结果:
|
|
|
|
|
|
@@ -58,18 +65,22 @@ slice 可以反复扩展直到占据整个相关数组。
|
|
|
|
|
|
另一个例子:
|
|
|
|
|
|
- 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
|
|
|
+```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重新分片
|
|
|
+将 a 重新分片:
|
|
|
|
|
|
- a = a[0:4] // ref of subarray {5,6,7,8} - len(a) is now 4 but cap(a) is still 5
|
|
|
+```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:
|
|
|
+**问题 7.7**
|
|
|
|
|
|
-1) 如果 a 是一个 slice,那么 s[n:n] 的长度是多少?
|
|
|
+1) 如果 a 是一个切片,那么 `s[n:n]` 的长度是多少?
|
|
|
|
|
|
-2) s[n:n+1] 的长度又是多少?
|
|
|
+2) `s[n:n+1]` 的长度又是多少?
|
|
|
|
|
|
## 链接
|
|
|
|