我認(rèn)為在GO語言中,切片是通過引用傳遞的。但是,為什么下面的代碼不更改切片c的內(nèi)容?我想念什么嗎?謝謝你。package mainimport ( "fmt")func call(c []int) { c = append(c, 1) fmt.Println(c)}func main() { c := make([]int, 1, 5) fmt.Println(c) call(c) fmt.Println(c)}打印的結(jié)果是:[0] [0 1] [0]在我期待的時候[0] [0 1] [0 1]
2 回答

躍然一笑
TA貢獻(xiàn)1826條經(jīng)驗 獲得超6個贊
切片的長度保留在切片標(biāo)頭中,該標(biāo)頭未通過引用傳遞。您可以將切片視為包含指向數(shù)組,長度和容量的指針的結(jié)構(gòu)。
當(dāng)您追加到切片時,您修改了數(shù)據(jù)數(shù)組中的索引1,然后增加了切片標(biāo)頭中的長度。當(dāng)您返回時,c
在main函數(shù)中的長度為1,因此打印了相同的數(shù)據(jù)。
切片以這種方式工作的原因是,您可以讓多個切片指向相同的數(shù)據(jù)。例如:
x := []int{1,2,3} y := x[:2] // [1 2] z := x[1:] // [2 3]
所有這三個切片都指向同一基礎(chǔ)數(shù)組中的重疊數(shù)據(jù)。

守著一只汪
TA貢獻(xiàn)1872條經(jīng)驗 獲得超4個贊
Go總是通過價值傳遞。某些類型是引用類型,例如指針,地圖,通道;或部分引用類型,例如切片(由對底層數(shù)組的引用以及長度和容量的值組成)。但是,不管類型如何,所有內(nèi)容都是按值傳遞的。因此,分配給局部變量永遠(yuǎn)不會影響任何外部變量。
- 2 回答
- 0 關(guān)注
- 331 瀏覽
添加回答
舉報
0/150
提交
取消