append
向slice尾部添加数据,返回新的slice对象
package main
import "fmt"
func main() {
s := make([]int, 0, 5)
fmt.Printf("%p\n", &s) //0xc42000e1a0
s2 := append(s, 1)
fmt.Printf("%p\n", &s2) //0xc42000e1c0
fmt.Println(s, s2) //[] [1]
}
append多个值
package main
import "fmt"
func main() {
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
s := data[:3]
s2 := append(s, 100, 200)
fmt.Println(data) //[0 1 2 100 200 5 6 7 8 9]
fmt.Println(s) //[0 1 2]
fmt.Println(s2) //[0 1 2 100 200]
}
一旦超出原slice.cap限制,就会重新分配底层数组,即便原数组并未填满
package main
import "fmt"
func main() {
data := [...]int{0, 1, 2, 3, 4, 10:0}
s := data[:2:3]
s = append(s, 100, 200) //一次append两个值,超出s.cap限制,append后的s重新分配了底层数组,并复制数据,如果只追加一个值,则不会重新分配底层数组
fmt.Println(s, data) //重新分配底层数组,与原数组无关
fmt.Println(&s[0], &data[0]) //比对底层数组起始指针
}