1 回答

TA貢獻(xiàn)1794條經(jīng)驗(yàn) 獲得超7個(gè)贊
你必須了解 Go Slices 的 header。那么,你自己就能得到答案。
通過(guò)檢查reflect.SliceHeader
類型來(lái)查看切片標(biāo)頭中的內(nèi)容:
type SliceHeader struct {
? ? Data uintptr
? ? Len? int
? ? Cap? int
}
實(shí)際上,切片值是一個(gè)header,包含支持?jǐn)?shù)組以及長(zhǎng)度和容量。它包含一個(gè)指向?qū)嶋H存儲(chǔ)元素的數(shù)組的指針。切片值不包含元素(與數(shù)組不同)。
因此,當(dāng)傳遞或返回切片時(shí),將從該標(biāo)頭傳遞或返回一個(gè)副本以及指針。該指針指向同一個(gè)支持的數(shù)組。因此,如果您修改切片的元素,它也會(huì)修改支持的數(shù)組,因此所有切片(共享相同的支持?jǐn)?shù)組)也會(huì)得到更改。
因此,當(dāng)您將切片傳遞給函數(shù)時(shí),將從該標(biāo)頭創(chuàng)建一個(gè)副本,包括指針,該指針將指向相同的后備數(shù)組。修改切片的元素意味著修改后備數(shù)組的元素,因此共享相同后備數(shù)組的所有切片都將“觀察”更改。
- 1 回答
- 0 關(guān)注
- 116 瀏覽
添加回答
舉報(bào)