簡體   English   中英

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

[英]How 'pass by value slice' and 'the underlying array' behaves in Golang?

我正在嘗試在 GO 中實現深度優先搜索,但我面臨以下問題。

在 GO 中,每當我們將切片傳遞給函數時,它應該創建一個新的切片標頭,因為 GO 是通過值語言傳遞的,但同時新創建的切片應該指向前一個切片所指向的相同底層數組。

但是看起來在我的深度優先搜索功能中,傳遞的切片沒有指向同一個數組。

正如我們在下面提到的代碼中看到的,我以節點和切片作為參數遞歸調用深度優先遍歷函數,其中切片存儲每個訪問節點的值。 遍歷整棵樹后,我應該得到切片中的所有節點,但切片是空的。

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)那么它工作正常。

請參閱此示例轉到操場 append正在分配一個新切片,並將新切片保存到值中,而不是引用中。 您是對的,您不需要通過引用傳遞切片來修改底層元素,這正是我的示例中的editSlice函數所做的。

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語法,我更新了它以通過引用傳遞和修改切片( go playground )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM