你可以在内部循环中使用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。