append 函数的使用
1.内置函数append用来将元素追加到slice的后面
2.如果使用append追加时,原底层数组容量够时,还会使用原来的底层数组,并把新的元素复制到原数组的后面,
如果slice的容量不够时,就把原来的数组扩展一倍,并把原来的slice数组复制到新的扩充数组中,然后再
将新元素追加到数组的后面.
3.每次数组容量扩展时,通过扩展一倍的容量来减少内存的分配的次数,这样也保证了追加一个元素所消耗的是固定时间.
4.通常情况下,我们并不清楚一次append调用会不会导致一次新的内存分配,所以我们不能假设原来的slice和
新用append后的结果slice指向同一个底层数组,也无法证明它们指的是不同数组所以我们通常将append的
调用结果再次赋值传入append函数的slice.
5.append函数可以同时给slice添加多个元素,甚至添加另一个slice里的所有元素.
例如:var x []int x=append(x,1) x=append(x,2) x=append(x,x...)//1,2
//其中(...)表示函数可以接受可变长度参数列表
具体使用代码:
package main
import "fmt"
func main() {
//定义并创建一个切片
s1 := []int{1, 2, 3}
fmt.Println("原s1:", s1)
//append(s1, 5) // append(s1, 5) evaluated but not used ,不能够单独使用,必须把它赋给一个切片变量
s1 = append(s1, 5)
fmt.Println("新s1:", s1)
//通过make内置函数创建一个且切片,一般用for循环进行复制
s2 := make([]int, 10)
fmt.Println("原 s2:", s2) // s2: [0 0 0 0 0 0 0 0 0 0]
s2 = append(s2, 1)
fmt.Println("新 s2:", s2) // s2: [0 0 0 0 0 0 0 0 0 0 1]在后面加一个
for i := 0; i < len(s2); i++ {
s2[i] = i
}
fmt.Println("最新 s2:", s2)
//append 函数会智能的在底层数组容量上增长,一旦超越了原来的底层数组的容量,通常是以1倍容量重新分配底层数组
s3 := make([]int, 2)
fmt.Println("len(s3):", len(s3), "cap(s3):", cap(s3)) //len(s3): 2 cap(s3): 2
s3 = append(s3, 1)
fmt.Println(s3) //[0 0 1]
fmt.Println("len(s3):", len(s3), "cap(s3):", cap(s3)) //len(s3): 2 cap(s3): 4
s3 = append(s3, 1)
s3 = append(s3, 1)
fmt.Println("len(s3):", len(s3), "cap(s3):", cap(s3)) //len(s3): 5 cap(s3): 8
}