1 回答

TA貢獻(xiàn)2003條經(jīng)驗(yàn) 獲得超2個(gè)贊
切片值只是標(biāo)頭,指向后備數(shù)組。切片頭只包含指針。所以當(dāng)你復(fù)制一個(gè)切片值時(shí),副本也會(huì)指向同一個(gè)后備數(shù)組。因此,如果您通過(guò)原始切片標(biāo)頭更改支持?jǐn)?shù)組,則副本也會(huì)觀察到更改。
這就是你的情況。你分配area1
給area2
.?單元格是一個(gè)切片數(shù)組。因此將復(fù)制數(shù)組,其中包含切片標(biāo)頭,因此將復(fù)制切片標(biāo)頭。切片頭包含指向支持?jǐn)?shù)組的指針,支持?jǐn)?shù)組不會(huì)被復(fù)制。
所以只有一個(gè)支持?jǐn)?shù)組來(lái)保存[5, 6, 7]
元素。然后調(diào)用removeValueFromCell()
,它會(huì)修改這個(gè)后備數(shù)組:
Before: [5,?6,?7] After: [5,?7,?7]
因?yàn)樵撛?code>6已被刪除,所以切片的其余部分(元素[7]
)被復(fù)制以代替被刪除的元素。
然后您將這個(gè)新的切片標(biāo)頭(正確地只包含 2 個(gè)元素)分配給area1.Cells[1]
.
但是 slice 值area2.Cells[1]
指向同一個(gè)后備數(shù)組,并且由于您沒有觸及這個(gè) slice 值,它的長(zhǎng)度仍然是3
,所以它會(huì)看到所有后備數(shù)組都更改了元素:[5, 7, 7]
。
另請(qǐng)注意,您的 實(shí)現(xiàn)removeValueFromCell()
是錯(cuò)誤的,因?yàn)槿绻梢苿?dòng)元素在切片中多次列出,它的行為將不正確。這樣做的原因是因?yàn)楫?dāng)您刪除一個(gè)元素時(shí),后續(xù)元素的索引會(huì)移動(dòng)(減少 1),但您的循環(huán)變量不會(huì)考慮到這一點(diǎn)。最容易處理的是使用向下循環(huán)。
- 1 回答
- 0 關(guān)注
- 151 瀏覽
添加回答
舉報(bào)