我试图复制多维切片,因为当我在重复切片中更改了元素时,原始元素中的元素也被覆盖了。
对我有用的唯一方法是:
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]
}
}
有没有其他方法 - 更短或更有效地实现相同的结果?感谢
答案 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)
}