登录
首页 >  Golang >  Go问答

将数组的映射键改为二维切片

来源:stackoverflow

时间:2024-03-24 11:18:40 455浏览 收藏

本文讨论了将映射中的数组键转换为二维切片的问题。在最初的尝试中,生成的切片重复了三元组,因为循环变量被覆盖。解决方案是创建数组的副本,而不是使用循环变量,以确保每个切片包含一个唯一的数组。

问题内容

我创建了一组 int 数组(以保留唯一的三元组),并且在执行一些步骤后需要返回三元组列表。以下代码片段仅显示尝试进行此转换的部分,并且那里出了问题。生成的 2d 切片会重复三元组​​。 请帮我解决以下问题:

  1. 以下代码有什么问题?
  2. 进行此转换的正确方法应该是什么?

尝试演示

func main() {
    setOfTriplets := make(map[[3]int]struct{})

    // Oversimplified steps here just to show some usage of the setOfTriplets.
    t1, t2 := [3]int{1, 2, 3}, [3]int{4, 5, 6}
    setOfTriplets[t1] = struct{}{}
    setOfTriplets[t2] = struct{}{}

    // Convert the triplets to 2D slice (because that's what I need in the bigger problem)
    matrix := make([][]int, 0, len(setOfTriplets))

    for t, _ := range setOfTriplets {
        // array to slice
        st := t[:]

        // PROBLEM: Something unkown happening here.
        matrix = append(matrix, st)
    }

    // PROBLEM:
    // Expected Output: [[1 2 3] [4 5 6]]
    // Actual Output:   [[1 2 3] [1 2 3]] and sometimes [[4 5 6] [4 5 6]]
    fmt.Println(matrix)
}

解决方案


您正在使用循环变量来创建切片。循环变量是一个数组,每次迭代都会被覆盖。在第一次迭代期间,如果tiplet 是[1,2,3],则会将其复制到t 并从中创建一个切片。下一次迭代将使用 [4,5,6] 覆盖 t,这也将覆盖您之前添加到列表中的三元组。

要修复此问题,请创建数组的副本:

for t, _ := range setOfTriplets {
        t:=t // Copy the array
        // array to slice
        st := t[:]
        matrix = append(matrix, st)
    }

文中关于的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《将数组的映射键改为二维切片》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>