Golang多维切片复制

时间:2017-08-02 15:44:13

标签: go multidimensional-array slice

我试图复制多维切片,因为当我在重复切片中更改了元素时,原始元素中的元素也被覆盖了。

对我有用的唯一方法是:

duplicate := make([][]int, len(matrix))
for i := 0; i < len(matrix); i++ {
    duplicate[i] = make([]int, len(matrix[0]))
    for j := 0; j < len(matrix[0]); j++ {
        duplicate[i][j] = matrix[i][j]
    }
}

有没有其他方法 - 更短或更有效地实现相同的结果?感谢

2 个答案:

答案 0 :(得分:4)

你可以使用copy作为内部循环(应该更有效)和外部循环的范围(这会产生更好的代码)。

结果:

duplicate := make([][]int, len(matrix))
for i := range matrix {
    duplicate[i] = make([]int, len(matrix[i]))
    copy(duplicate[i], matrix[i])
}

如果您的目标是效率,那么预先做更多分配可能是有意义的。这不会导致更易读的代码,但如果您经常这样做,将导致更高效的代码。此代码假定您至少有一行,并且所有行的长度相同。您需要为此添加测试。

n := len(matrix)
m := len(matrix[0])
duplicate := make([][]int, n)
data := make([]int, n*m)
for i := range matrix {
    start := i*m
    end := start + m
    duplicate[i] = data[start:end:end]
    copy(duplicate[i], matrix[i])
}

根据您正在做的事情,制作仅使用单个切片实现的“矩阵类型”可能是有意义的。切片不是最有效的数据结构,即使它更易于使用。

在决定是否需要提高效率之前,请确保您花费大量时间使用性能分析进行复制。然后,在确定这实际上是一个热点之后,开始运行基准测试。有关详细信息,请参阅https://golang.org/pkg/testing/#hdr-Benchmarks

答案 1 :(得分:0)

你可以通过 gob 来回它:

package main

import (
   "bytes"
   "encoding/gob"
   "fmt"
)

func sliceCopy(in, out interface{}) {
   buf := new(bytes.Buffer)
   gob.NewEncoder(buf).Encode(in)
   gob.NewDecoder(buf).Decode(out)
}

func main() {
   a := [][]int{
      {1, 2, 3}, {4, 5, 6}, {7, 8, 9},
   }
   var b [][]int
   sliceCopy(a, &b)
   fmt.Println(b)
}

https://golang.org/pkg/encoding/gob