GO語言————7.5 切片的複製與追加

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

7.5 切片的複製與追加

如果想增加切片的容量,我們必須建立一個新的更大的切片並把原分片的內容都拷貝過來。下面的程式碼描述了從拷貝切片的 copy 函式和向切片追加新元素的 append 函式。

示例 7.12 copy_append_slice.go

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 索引的元素從切片 中移除。

相關文章