Golang 二维 Slice 深拷贝

2019.06.16

今天 leetcode 周赛, 一道 dfs 活生生的跪在了 slice 的机制上… 因为 slice 是引用类型, 所以函数间对 slice 的修改都会落到同一个数组上… 导致得不到预期的结果.

尝试 copy 无果… 以如下的方式 copy 仍然无法深拷贝成功

func main(){
  a := [][]int{
    {1, 2, 3},
    {4, 5, 6},
  }
  b := make([][]int, 3, 3)
  copy(b, a)

  b[1][2] = 999

  fmt.printf("%+v", a)
}

// output:
// [{1,2,3},{4,5,999}]

这种不符合预期的原因, 其实是因为初始化的问题, 导致 b 直接使用了 a 的底层数组

我们使用 make([][]int,3,3) 初始化到的 b 数组实际上长的像下面这样

{
	0:nil
	1:nil
    2:nil
}

这样复制的话, 可能直接 b 就用了 a 的底层数组.

所以正确的复制姿势是这样的…

func main(){
  a := [][]int{
    {1, 2, 3},
    {4, 5, 6},
  }
  b := make([][]int, 3, 3)
  for key, value := range b {
    b[key] = make([]int, 3, 3)
    copy(b[key], a[key])
  }

  b[1][2] = 999

  fmt.printf("%+v", a)
}
// output:
// [{1,2,3},{4,5,6}]

好的问题解决

// 丢了周赛挺进前五十的机会, SAD TAT

Last modified 2019.06.16