GO語言————7.5 切片的複製與追加
7.5 切片的複製與追加
如果想增加切片的容量,我們必須建立一個新的更大的切片並把原分片的內容都拷貝過來。下面的程式碼描述了從拷貝切片的 copy 函式和向切片追加新元素的 append 函式。
package main import "fmt" func main() { sl_from := []int{1, 2, 3} sl_to := make([]int, 10) n := copy(sl_to, sl_from) fmt.Println(sl_to) fmt.Printf("Copied %d elements\n", n) // n == 3 sl3 := []int{1, 2, 3} sl3 = append(sl3, 4, 5, 6) fmt.Println(sl3) }
func append(s[]T, x ...T) []T
其中 append 方法將 0 個或多個具有相同型別 s 的元素追加到切片後面並且返回新的切片;追加的元素必須和原切片的元素同類型。如果 s 的容量不足以儲存新增元素,append 會分配新的切片來保證已有切片元素和新增元素的儲存。因此,返回的切片可能已經指向一個不同的相關陣列了。append 方法總是返回成功,除非系統記憶體耗盡了。
如果你想將切片 y 追加到切片 x 後面,只要將第二個引數擴充套件成一個列表即可:x = append(x, y...)
注意: append 在大多數情況下很好用,但是如果你想完全掌控整個追加過程,你可以實現一個這樣的 AppendByte 方法:
func AppendByte(slice []byte, data ...byte) []byte { m := len(slice) n := m + len(data) if n > cap(slice) { // if necessary, reallocate // allocate double what's needed, for future growth. newSlice := make([]byte, (n+1)*2) copy(newSlice, slice) slice = newSlice } slice = slice[0:n] copy(slice[m:n], data) return slice }
func copy(dst, src []T) int
copy 方法將型別為 T 的切片從源地址 src 拷貝到目標地址 dst,覆蓋 dst 的相關元素,並且返回拷貝的元素個數。源地址和目標地址可能會有重疊。拷貝個數是 src 和 dst 的長度最小值。如果 src 是字串那麼元素型別就是 byte。如果你還想繼續使用 src,在拷貝結束後執行 src = dst
。
練習 7.9
給定 slice s[]int
和一個 int 型別的因子,擴充套件 s 使其長度為 len(s) * factor
。
練習 7.10
用順序函式過濾容器:s 是前 10 個整型的切片。構造一個函式 Filter,第一個引數是 s,第二個引數是一個 fn func(int) bool
,返回滿足函式 fn 的元素切片。通過 fn 測試方法測試當整型值是偶數時的情況。
練習 7.11
寫一個函式 InsertStringSlice 將切片插入到另一個切片的指定位置。
練習 7.12
寫一個函式 RemoveStringSlice 將從 start 到 end 索引的元素從切片 中移除。