Golang:将关键帧从贴图附加到切片 [英] Golang: Appending keys from a map to a slice of slices
本文介绍了Golang:将关键帧从贴图附加到切片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我遇到了这个简单的Golang代码,并对Go在这里的行为感到惊讶。谁能解释一下这里发生了什么,以及如何正确编写以下代码?
如您所见,我有一个map
,其中键是int
的array
。我添加了几个值,然后循环访问map
,将每个键转换为slice
,并将每个键附加到[][]int
类型的对象。
func test() {
myMap := make(map[[3]int]bool)
myMap[[3]int{1, 2, 3}] = true
myMap[[3]int{0, 5, 4}] = true
myMap[[3]int{9, 7, 1}] = true
myMap[[3]int{0, 2, 8}] = true
array := [][]int{}
for val := range myMap {
array = append(array, val[:])
}
fmt.Println(array)
}
我本以为要打印[[1,2,3], [0,5,4], [9,7,1], [0,2,8]]
的最后一行,但令我惊讶的是,它多次打印[[0 2 8] [0 2 8] [0 2 8] [0 2 8]]
、或[[9 7 1] [9 7 1] [9 7 1] [9 7 1]]
或仅包含其中一个键的某些其他变体。
我的Go版本是1.16.5
推荐答案
在for循环中,循环变量在每次迭代时被覆盖。也就是说,val
是一个数组,对于每一次迭代,val
的内容被映射中的下一项覆盖。由于您添加了片(简单地说是数组上的视图),所以所有片都有val
作为后备数组,并且它们都有相同的内容,也就是说,无论最后一个元素迭代了什么。
要修复,请复制数组:
for val := range myMap {
val:=val
array = append(array, val[:])
}
这篇关于Golang:将关键帧从贴图附加到切片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文