解釋下面現(xiàn)象:
func main() {
s := []int{5}
s = append(s, 7)
s = append(s, 9)
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y)
}
//結(jié)果是:[5 7 9] [5 7 9 12] [5 7 9 12]
因?yàn)閟lice相當(dāng)于數(shù)組的視圖,實(shí)際保存數(shù)據(jù)的是數(shù)組钦购。當(dāng)向slice添加元素時(shí)實(shí)際是在向數(shù)組中添加。
如果添加的數(shù)據(jù)超過(guò)了數(shù)組cap
的大小,就會(huì)重新申請(qǐng)一個(gè)更大的數(shù)組贱傀,將元素復(fù)制過(guò)去。
這里的s
原本的cap
值是4剿吻,追加元素沒(méi)有超過(guò)4窍箍,所以一直都是在同一個(gè)數(shù)組里操作。
func main() {
s := []int{5}
fmt.Println(cap(s)) //1
s = append(s, 7)
fmt.Println(cap(s)) //2
s = append(s, 9)
fmt.Println(cap(s)) //4
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y) //[5 7 9] [5 7 9 12] [5 7 9 12]
}