2 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個(gè)贊
切片只是數(shù)組一部分的窗口,它沒(méi)有特定的存儲(chǔ)空間。
這意味著如果在數(shù)組的同一部分有兩個(gè)切片,則兩個(gè)切片必須“包含”相同的值。
這正是這里發(fā)生的事情:
當(dāng)您執(zhí)行第一個(gè)操作時(shí)
append
,您將在一個(gè)大小2
為基礎(chǔ)的數(shù)組上獲得一個(gè)新的大小切片2
。當(dāng)您執(zhí)行 next 時(shí)
append
,您將獲得一個(gè)新的大小切片,3
但底層數(shù)組的大小4
(append
通常分配的空間比立即需要的空間多,因此不需要在每次追加時(shí)分配)。這意味著 next
append
不需要新數(shù)組。因此x
,y
兩者都將使用與先例 slice 相同的底層數(shù)組s
。你寫(xiě)11
然后12
在這個(gè)數(shù)組的同一個(gè)槽中,即使你得到兩個(gè)不同的切片(記住,它們只是窗口)。
您可以通過(guò)在每次 append 后打印切片的容量來(lái)檢查:
fmt.Println(cap(s))
如果你想在x
and 中有不同的值y
,你應(yīng)該做一個(gè)副本,例如這樣:
s := []int{5}
s = append(s, 7)
s = append(s, 9)
x := make([]int,len(s))
copy(x,s)
x = append(x, 11)
y := append(s, 12)
fmt.Println(s, x, y)
這里的另一個(gè)解決方案可能是強(qiáng)制s切片后面的數(shù)組的容量不大于所需的容量(從而確保以下兩個(gè)append 必須使用新數(shù)組):
s := []int{5}
s = append(s, 7)
s = append(s, 9)
s = s[0:len(s):len(s)]
x := append(s, 11)
y := append(s, 12)
fmt.Println(s, x, y)

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個(gè)贊
dystroy 很好地解釋了它。我喜歡為行為添加視覺(jué)解釋。
切片只是數(shù)組段的描述符。它由指向數(shù)組的指針 (ptr)、段的長(zhǎng)度 (len) 和容量 (cap) 組成。
+-----+
| ptr |
|*Elem|
+-----+
| len |
|int |
+-----+
| cap |
|int |
+-----+
所以,代碼的解釋如下;
func main() {
+
|
s := []int{5} | s -> +-----+
| []int | ptr +-----> +---+
| |*int | [1]int| 5 |
| +-----+ +---+
| |len=1|
| |int |
| +-----+
| |cap=1|
| |int |
| +-----+
|
s = append(s,7) | s -> +-----+
| []int | ptr +-----> +---+---+
| |*int | [2]int| 5 | 7 |
| +-----+ +---+---+
| |len=2|
| |int |
| +-----+
| |cap=2|
| |int |
| +-----+
|
s = append(s,9) | s -> +-----+
| []int | ptr +-----> +---+---+---+---+
| |*int | [4]int| 5 | 7 | 9 | |
| +-----+ +---+---+---+---+
| |len=3|
| |int |
| +-----+
| |cap=4|
| |int |
| +-----+
|
x := append(s,11) | +-------------+-----> +---+---+---+---+
| | | [4]int| 5 | 7 | 9 |11 |
| | | +---+---+---+---+
| s -> +--+--+ x -> +--+--+
| []int | ptr | []int | ptr |
| |*int | |*int |
| +-----+ +-----+
| |len=3| |len=4|
| |int | |int |
| +-----+ +-----+
| |cap=4| |cap=4|
| |int | |int |
| +-----+ +-----+
|
y := append(s,12) | +-----> +---+---+---+---+
| | [4]int| 5 | 7 | 9 |12 |
| | +---+---+---+---+
| |
| +-------------+-------------+
| | | |
| s -> +--+--+ x -> +--+--+ y -> +--+--+
| []int | ptr | []int | ptr | []int | ptr |
| |*int | |*int | |*int |
| +-----+ +-----+ +-----+
| |len=3| |len=4| |len=4|
| |int | |int | |int |
| +-----+ +-----+ +-----+
| |cap=4| |cap=4| |cap=4|
| |int | |int | |int |
+ +-----+ +-----+ +-----+
fmt.Println(s,x,y)
}
- 2 回答
- 0 關(guān)注
- 219 瀏覽
添加回答
舉報(bào)