内側ループ(より効率的でなければならない)と外側ループの範囲(より良いコードになります)のコピーを使用できます。
結果:
duplicate := make([][]int, len(matrix))
for i := range matrix {
duplicate[i] = make([]int, len(matrix[i]))
copy(duplicate[i], matrix[i])
}
あなたの目標は効率である場合、それはフロントまでより多くの割り当てを行うには意味をなさないことがあります。これにより、より読みやすいコードにはなりませんが、これを頻繁に行う場合は、より効率的なコードにつながります。このコードでは、少なくとも1つの行があり、すべての行の長さが同じであることを前提としています。そのためのテストを追加する必要があります。
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を使ってinner forループを削除することはできますが、それがより効率的かどうかはわかりません。私は組み込みがあると思います。 – RayfenWindspear
ありがとう、働いている)少なくとも書くことは少ない –
私はそれがどのように比較するのか興味があるので、あとでベンチマークすることもできます。 – RayfenWindspear