我正在嘗試在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 關注
- 85 瀏覽
添加回答
舉報
0/150
提交
取消