我有一個帶有鍵陣列的地圖。我想將所有鍵/陣列添加到切片中。
但是,我得到了意想不到的結果。
代碼:
package main
import "fmt"
func main() {
var finalResult [][]int
set := make(map[[2]int]int)
a, b, c := [2]int{1, 1}, [2]int{2, 2}, [2]int{3, 3}
set[a], set[b], set[c] = 1, 1, 1
fmt.Println("set: ", set)
for x := range set {
fmt.Println("\nfinalResult 0: ", finalResult)
fmt.Println("x: ", x[:])
finalResult = append(finalResult, x[:])
fmt.Println("finalResult 1: ", finalResult)
}
}
輸出:
set: map[[1 1]:1 [2 2]:1 [3 3]:1]
finalResult 0: []
x: [1 1]
finalResult 1: [[1 1]]
finalResult 0: [[2 2]]
x: [2 2]
finalResult 1: [[2 2] [2 2]]
finalResult 0: [[3 3] [3 3]]
x: [3 3]
finalResult 1: [[3 3] [3 3] [3 3]]
finalResult 似乎在 for 回圈期間發生了變化?
有人可以解釋正在發生的事情以及我如何解決這個問題嗎?
uj5u.com熱心網友回復:
問題是,您將x區域變數附加到finalResult,這是一個指標,因此在每個 for 回圈中,x將指向記憶體中的一個新陣列。當您將這x三次添加到 finalResult 并列印它時,這三個x都將指向相同的記憶體地址。您必須將每個回圈中指向的內容復制x到一個新變數并將其添加到 finalResult。
package main
import "fmt"
func main() {
var finalResult [][]int
set := make(map[[2]int]int)
a, b, c := [2]int{1, 1}, [2]int{2, 2}, [2]int{3, 3}
set[a], set[b], set[c] = 1, 1, 1
fmt.Println("set: ", set)
for x := range set {
fmt.Println("\nfinalResult 0: ", finalResult)
fmt.Println("x: ", x[:])
a := make([]int, 2)
copy(a, x[:])
finalResult = append(finalResult, a)
fmt.Println("finalResult 1: ", finalResult)
}
}
但請注意,地圖上的測距始終是隨機順序的,因此您的最終結果可能會在每次運行時發生變化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/469111.html
