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