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

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

“按值切片傳遞”和“底層數組”在 Golang 中的行為如何?

“按值切片傳遞”和“底層數組”在 Golang 中的行為如何?

Go
蕭十郎 2022-09-12 16:57:08
我正在嘗試在GO中實現深度優先搜索,我面臨以下問題。在GO中,每當我們將切片傳遞給函數時,它都應該創建一個新的切片標題,因為GO是按值語言傳遞的,但同時新創建的切片應該指向前一個切片指向的同一基礎數組。但看起來在我的深度第一個搜索函數中,傳遞的切片不指向同一個數組。正如我們在下面提到的代碼中看到的那樣,我以遞歸方式調用深度優先遍歷函數,并將節點和切片作為參數,其中seft存儲每個訪問節點的值。遍歷整個樹后,我應該得到切片中的所有節點,但切片是空的。func (b *BinarySearchTree) DFSInOrder(node *Node, list []int) {    if node.Left != nil {        b.DFSInOrder(node.Left, list)    }    list = append(list, node.Value)    if node.Right != nil {        b.DFSInOrder(node.Right, list)    }}func main() {    //...    //BinarySearchTree creation code    //...        var list []int    b.DFSInOrder(b.Root, list)    fmt.Println()    fmt.Println("List after traversing:", list)}理想情況下,在每個遞歸調用中,即使它正在創建新切片,它也應該更新相同的基礎數組,最后原始切片應具有所有節點,但它是空的。有人能解釋一下為什么會發生這種情況嗎?請在此處找到完整代碼以獲取更多詳細信息:https://play.golang.com/p/PCrADg3zYV8 第51行的檢查功能。注意:如果我傳遞切片指針,那么它工作正常。(list *[]int)
查看完整描述

1 回答

?
Cats萌萌

TA貢獻1805條經驗 獲得超9個贊

請參閱此示例轉到游樂場。 分配新切片,并將新切片保存到值,而不是引用。你是對的,你不需要通過引用傳遞切片來修改基礎元素,這就是我的例子中的函數所做的事情。appendeditSlice


package main


import (

    "fmt"

)


func main() {

    slice := []int{10, 20}

    appendSlice(slice)

    fmt.Println("slice after append ", slice)


    editSlice(slice)

    fmt.Println("slice after edit ", slice)

}


func appendSlice(s []int) {

    s = append(s, s[0])

    fmt.Println("the appended slice ", s)

}


func editSlice(s []int) {

    s[0] = s[0] * 2

}

如果您仍然想在代碼中使用該語法,我對其進行了更新,以通過引用傳遞和修改切片(轉到游樂場)。append


查看完整回答
反對 回復 2022-09-12
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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