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

鏈接

results matching ""

    No results matching ""