亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Golang切片是否按值傳遞?

Golang切片是否按值傳遞?

Go
慕尼黑8549860 2019-11-02 10:00:35
在Golang中,我試圖為我的旅行推銷員問題創建一個加擾切片函數。這樣做時,我注意到當我開始編輯切片時,每次傳遞時,我賦予的加密功能都是不同的。經過一些調試后,我發現這是由于我在函數內部編輯了切片。但是既然Golang被認為是一種“價值傳遞”的語言,那怎么可能呢?https://play.golang.org/p/mMivoH0TuV我提供了一個游樂場鏈接來顯示我的意思。通過刪除第27行,您獲得的輸出與留在其中的輸出將有所不同,這應該不會有所不同,因為該函數在作為參數傳入時應該具有自己的切片副本。有人可以解釋這種現象嗎?
查看完整描述

2 回答

?
ABOUTYOU

TA貢獻1812條經驗 獲得超5個贊

是的,Go中的所有內容都通過值傳遞。切片也。但是slice值是一個標頭,描述了后備數組的連續部分,而slice值僅包含指向實際存儲元素的數組的指針。slice值不包含其元素(與數組不同)。


因此,當您將切片傳遞給函數時,將從該標頭(包括指針)進行復制,該指針將指向同一后備數組。修改切片的元素意味著修改后備數組的元素,因此共享同一后備數組的所有切片將“觀察”更改。


要查看切片頭中的內容,請檢查reflect.SliceHeader類型:


type SliceHeader struct {

    Data uintptr

    Len  int

    Cap  int

}


查看完整回答
1 反對 回復 2019-11-02
?
DIEA

TA貢獻1820條經驗 獲得超2個贊

頭包含長度。如果添加元素,則必須增加長度,因此即使后備數組為該附加元素留出空間,并且沒有分配新的后備數組并復制現有元素,原始切片標頭也不會“看到”它。這就是為什么內置append()函數必須返回新的slice值的原因。更不用說是否必須分配新的陣列... 

查看完整回答
反對 回復 2019-11-02
  • 2 回答
  • 0 關注
  • 1546 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號