常规情况下 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) 复制一维切片,复制二维切片时仅仅复制了二维且切片里面的切片引用。
好了,就说这么多,祝各位策码奔腾!