2 回答

TA貢獻(xiàn)1812條經(jīng)驗(yàn) 獲得超5個(gè)贊
是的,Go中的所有內(nèi)容都通過值傳遞。切片也。但是slice值是一個(gè)標(biāo)頭,描述了后備數(shù)組的連續(xù)部分,而slice值僅包含指向?qū)嶋H存儲(chǔ)元素的數(shù)組的指針。slice值不包含其元素(與數(shù)組不同)。
因此,當(dāng)您將切片傳遞給函數(shù)時(shí),將從該標(biāo)頭(包括指針)進(jìn)行復(fù)制,該指針將指向同一后備數(shù)組。修改切片的元素意味著修改后備數(shù)組的元素,因此共享同一后備數(shù)組的所有切片將“觀察”更改。
要查看切片頭中的內(nèi)容,請(qǐng)檢查reflect.SliceHeader類型:
type SliceHeader struct {
Data uintptr
Len int
Cap int
}

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超2個(gè)贊
頭包含長(zhǎng)度。如果添加元素,則必須增加長(zhǎng)度,因此即使后備數(shù)組為該附加元素留出空間,并且沒有分配新的后備數(shù)組并復(fù)制現(xiàn)有元素,原始切片標(biāo)頭也不會(huì)“看到”它。這就是為什么內(nèi)置append()函數(shù)必須返回新的slice值的原因。更不用說是否必須分配新的陣列...
- 2 回答
- 0 關(guān)注
- 1544 瀏覽
添加回答
舉報(bào)