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
}