繁体   English   中英

Golang 多维切片复制

[英]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)
}

https://golang.org/pkg/encoding/gob

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM