Ser*_*nco 2 go slice multidimensional-array
我试图制作多维切片的副本,因为当我更改重复切片中的元素时,原始切片中的元素也会被覆盖。
对我有用的唯一方法是:
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]
}
}
Run Code Online (Sandbox Code Playgroud)
还有其他方法-更短或更有效地获得相同结果吗?谢谢
您可以将copy用于内部循环(应该更有效),将range用于外部循环(这会产生更好的代码)。
结果:
duplicate := make([][]int, len(matrix))
for i := range matrix {
duplicate[i] = make([]int, len(matrix[i]))
copy(duplicate[i], matrix[i])
}
Run Code Online (Sandbox Code Playgroud)
如果您的目标是效率,那么可能需要提前进行更多分配。这不会导致代码更具可读性,但是如果您经常这样做,则会导致代码效率更高。此代码假定您至少有一行,并且所有行的长度相同。您将需要为此添加测试。
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])
}
Run Code Online (Sandbox Code Playgroud)
根据您正在执行的操作,使仅使用单个切片实现的“矩阵类型”可能有意义。切片虽然不是最简单的数据结构,但却不是最有效的数据结构。
在决定是否需要提高效率之前,请确保您花费大量时间使用性能分析进行复制。然后,在确定这实际上是一个热点之后,开始运行基准测试。有关详细信息,请参见https://golang.org/pkg/testing/#hdr-基准。