将数组(从地图)添加到 Go 中的一片切片
Adding arrays (from a map) to a slice of slices in Go
我有一张带有键数组的地图。
我想将所有 keys/arrays 添加到一片切片中。
然而,我得到了意想不到的结果。
代码:
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 循环期间发生变化?
谁能解释一下发生了什么以及我该如何解决这个问题?
问题是,您将 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)
}
}
但请注意,地图上的测距总是随机顺序,因此您的最终结果可能会在每个 运行 上发生变化。
我有一张带有键数组的地图。 我想将所有 keys/arrays 添加到一片切片中。
然而,我得到了意想不到的结果。
代码:
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 循环期间发生变化?
谁能解释一下发生了什么以及我该如何解决这个问题?
问题是,您将 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)
}
}
但请注意,地图上的测距总是随机顺序,因此您的最终结果可能会在每个 运行 上发生变化。