[英]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.