7.5 切片的复制与追加

    示例 7.12

    其中 append 方法将 0 个或多个具有相同类型 s 的元素追加到切片后面并且返回新的切片;追加的元素必须和原切片的元素同类型。如果 s 的容量不足以存储新增元素,append 会分配新的切片来保证已有切片元素和新增元素的存储。因此,返回的切片可能已经指向一个不同的相关数组了。append 方法总是返回成功,除非系统内存耗尽了。

    如果你想将切片 y 追加到切片 x 后面,只要将第二个参数扩展成一个列表即可:x = append(x, y...)

    1. func AppendByte(slice []byte, data ...byte) []byte {
    2. m := len(slice)
    3. n := m + len(data)
    4. if n > cap(slice) { // if necessary, reallocate
    5. newSlice := make([]byte, (n+1)*2)
    6. copy(newSlice, slice)
    7. slice = newSlice
    8. }
    9. slice = slice[0:n]
    10. return slice
    11. }

    func copy(dst, src []T) int copy 方法将类型为 T 的切片从源地址 src 拷贝到目标地址 dst,覆盖 dst 的相关元素,并且返回拷贝的元素个数。源地址和目标地址可能会有重叠。拷贝个数是 src 和 dst 的长度最小值。如果 src 是字符串那么元素类型就是 byte。如果你还想继续使用 src,在拷贝结束后执行 src = dst

    练习 7.9

    给定一个slices []int 和一个 int 类型的因子factor,扩展 s 使其长度为 。

    用顺序函数过滤容器:s 是前 10 个整型的切片。构造一个函数 Filter,第一个参数是 s,第二个参数是一个 fn func(int) bool,返回满足函数 fn 的元素切片。通过 fn 测试方法测试当整型值是偶数时的情况。

    练习 7.11

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

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