3 回答

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超3個(gè)贊
您將切片、數(shù)據(jù)類型與實(shí)際表示混淆了。切片描述符由一對(duì) int 組成,一個(gè)用于 len,一個(gè)用于 cap,以及一個(gè)指向底層數(shù)據(jù)的指針。
因此, append 返回的確實(shí)是一個(gè)新切片,而傳遞給 add 選項(xiàng)的確實(shí)是切片描述符的副本。但是由于描述符有一個(gè)指向數(shù)據(jù)的指針,所以指針值(指向底層數(shù)據(jù)的地址)是相同的。
編輯:這是一個(gè)代碼片段來說明我的觀點(diǎn):
package main
import "fmt"
func main() {
s := make([]int, 0, 5)
s = append(s, []int{1, 2, 3, 4}...)
a := append(s, 5)
fmt.Println(a)
b := append(s, 6)
fmt.Println(b)
fmt.Println(a)
}
如果你運(yùn)行這個(gè),你會(huì)得到:
[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 6]
因?yàn)榧热籹仍然有能力,都a和b共享相同的數(shù)據(jù)PTR。如果將容量更改為 4,則會(huì)打?。?/p>
[1 2 3 4 5]
[1 2 3 4 6]
[1 2 3 4 5]

TA貢獻(xiàn)1827條經(jīng)驗(yàn) 獲得超9個(gè)贊
當(dāng)append()創(chuàng)建一個(gè)新切片時(shí),它不會(huì)創(chuàng)建一個(gè)只比之前的切片大一個(gè)的切片。它實(shí)際上創(chuàng)建了一個(gè)比前一個(gè)大幾個(gè)元素的切片??纯催@個(gè)代碼:
package main
import "fmt"
func main() {
var sl []bool
for i := 0; i < 100; i++ {
sl = append(sl, true)
fmt.Println(cap(sl))
}
}
Playground
如果您運(yùn)行此代碼,您會(huì)看到容量最初在每次分配時(shí)翻倍;對(duì)于更大的切片大小,這個(gè)策略當(dāng)然會(huì)改變。
- 3 回答
- 0 關(guān)注
- 299 瀏覽
添加回答
舉報(bào)