为了账号安全,请及时绑定邮箱和手机立即绑定

将数组类型的映射键转换为二维切片

将数组类型的映射键转换为二维切片

Go
缥缈止盈 2022-07-18 15:49:39
我创建了一组 int 数组(以保持唯一的三元组),并且在执行一些步骤后需要返回三元组列表。以下代码段仅显示了尝试进行此转换的部分,并且那里出现了问题。生成的 2D 切片正在复制三胞胎。请帮我解决以下问题:以下代码有什么问题?进行这种转换的正确方法应该是什么?尝试游乐场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)}
查看完整描述

1 回答

?
qq_遁去的一_1

TA贡献1725条经验 获得超7个赞

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


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


   for t, _ := range setOfTriplets {

        t:=t // Copy the array

        // array to slice

        st := t[:]

        matrix = append(matrix, st)

    }


查看完整回答
反对 回复 2022-07-18
  • 1 回答
  • 0 关注
  • 92 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信