[英]Golang multidimensional slice copy
我试图制作多维切片的克隆,因为当我更改复制切片中的元素时,原始切片中的元素也被覆盖。
唯一对我有用的方法是:
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]
}
}
有没有其他方法 - 更短或更有效地达到相同的结果? 谢谢
您可以为内循环使用 copy (这应该更有效),并为外循环使用 range (这会产生更好的代码)。
结果:
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 。
你可以通过 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)
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.