Go語言————7.4 切片重組(reslice)

FLy_鵬程萬里發表於2018-07-01

7.4 切片重組(reslice)

我們已經知道切片建立的時候通常比相關陣列小,例如:

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 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] 的長度又是多少?


相關文章