为了账号安全,请及时绑定邮箱和手机立即绑定

“按值切片传递”和“底层数组”在 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 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信