如果想增加切片的容量,我们必须创建一个新的更大的切片并把原分片的内容都拷贝过来。下面的代码描述了从拷贝切片的 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
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) intsrc = dst

练习 7.9

magnify_slice.go

slice s[]intlen(s) * factor

练习 7.10

filter_slice.go

使用高阶函数对一个集合进行过滤:s是前10个整数的一个切片。建立一个函数Filter,它接受s作为第一参数,fn func(int) bool作为第二参数,并返回满足函数fn的s元素的切片(使其为真)。用fn测试整数是否为偶数。

练习 7.11

insert_slice.go

编写一个函数 InsertStringSlice 将切片插入到另一个切片的指定位置。

练习 7.12

remove_slice.go

编写一个函数 RemoveStringSlice 将从 start 到 end 索引的元素从切片 中移除。