這里的問題是,當我們將 go 語言中的陣列作為引數發送給函式時,它的行為方式與簡單變數的行為方式不同。讓我們比較一下這兩個例子:
func do(vis bool) {
vis = false
}
func main() {
vis := true
fmt.Println(vis)
do(vis)
fmt.Println(vis)
}
在上面的示例中,該函式沒有更改全域變數vis,因此它在初始化時保持為真。正如您在以下輸出中看到的那樣。
true
true
但是,在第二個示例中,我發現了完全不同的行為:
func do(vis []bool) {
for idx := range vis {
vis[idx] = false
}
}
func main() {
vis := []bool{true, true, true, true}
fmt.Println(vis)
do(vis)
fmt.Println(vis)
}
這是輸出:
[true true true true]
[false false false false]
vis盡管我沒有傳遞陣列的地址以便它可以更改它,但它的內容已經發生了顯著變化。你能解釋一下為什么變數會這樣改變嗎?
uj5u.com熱心網友回復:
您沒有將陣列傳遞給函式,而是傳遞了一個切片。
陣列和切片是 go 中的兩個不同的東西。陣列的行為與您預期的一樣:當您傳遞一個陣列時,它的副本被傳遞給函式,并且函式對副本進行操作。切片也會發生同樣的事情,切片的副本被傳遞給函式。然而,切片實際上是一個指向底層陣列的小型資料結構。因此,修改切片的函式可以改變切片指向的陣列。
例如,如果函式附加到該切片,則呼叫者將看不到附加的切片。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506463.html
