Golang:将关键帧从贴图附加到切片 [英] Golang: Appending keys from a map to a slice of slices

查看:9
本文介绍了Golang:将关键帧从贴图附加到切片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了这个简单的Golang代码,并对Go在这里的行为感到惊讶。谁能解释一下这里发生了什么,以及如何正确编写以下代码?

如您所见,我有一个map,其中键是intarray。我添加了几个值,然后循环访问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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆