常规情况下 golang 的一维数组复制,可以这样写:

func copy(src []int) []int {
	copy0 := make([]int, len(src))
	copy(copy0, src)
    return copy0
}

这样写,会新开辟一块内存空间,对切片副本的任何修改操作,不会影响原切片

如果需求是二维数组,出于惯性思维,可能会这样写:

func copy0(src [][]int) [][]int {
	copy0 := make_slice2(len(src), len(src[0]))
    // 对多维切片调用 copy
	copy(copy0, src)
    return copy0
}

// make_slice2 创建二维切片
func make_slice2(len1, len2 int) [][]int{
	slice2 := make([][]int, len1)
	for i := range slice2 {
		slice2[i] = make([]int, len2)
	}
	return slice2
}

然后就出问题了:对副本切片的修改,会直接映射到原切片上。对多维切片的复制应该使用如下操作:

func copy1(src [][]int) [][]int{
	len1, len2 := len(src), len(src[0])
	copy0 := make([][]int, len1)
	for i := range copy0 {
		copy0[i] = make([]int, len2)
		copy(copy0[i], src[i])
	}
	return copy0
}

多维切片里面的元素类型一个切片,使用 copy(dst, src []Type) 复制一维切片,复制二维切片时仅仅复制了二维且切片里面的切片引用。

好了,就说这么多,祝各位策码奔腾!