我正在尝试在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
- 1 回答
- 0 关注
- 73 浏览
添加回答
举报
0/150
提交
取消