你可以使用副本的内部循环(应该更有效率)和外部循环的范围(这导致更好的代码)。
结果:
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。
您可以使用https://golang.org/pkg/builtin/#copy消除内循环,但我不确定它是否更有效。我猜想内建是会的。 – RayfenWindspear
谢谢,工作;)至少不会写 –
我可能稍后会对它进行基准测试,因为我很好奇它是如何比较的。 – RayfenWindspear