“按值切片传递”和“底层数组”在 Golang 中的行为如何?

我正在尝试在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)


萧十郎
浏览 74回答 1
1回答

Cats萌萌

请参阅此示例转到游乐场。 分配新切片,并将新切片保存到值,而不是引用。你是对的,你不需要通过引用传递切片来修改基础元素,这就是我的例子中的函数所做的事情。appendeditSlicepackage mainimport (    "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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go