golang数组切片拷贝问题
摘要:数组切片传递数组在传递中采用引用传递,即使重新赋值也是只是复制他的一份内存地址例如:func main() {array1:=[]string{"00","01"}array2:=array1array1[0]="asd"fmt.Print
数组切片传递
数组在传递中采用引用传递,即使重新赋值也是只是复制他的一份内存地址
例如:
func main() {
array1:=[]string{"00","01"}
array2:=array1
array1[0]="asd"
fmt.Println(array1)
fmt.Println(array2)
}
输出:
[asd 01]
[asd 01]
使用COPY来解决这个问题
注意初始化时的长度要和拷贝数组长度>=
func main() {
array1:=[]string{"00","01"}
array2:=make([]string, len(array1))
copy(array2,array1)
array1[0]="asd"
fmt.Println(array1)
fmt.Println(array2)
}
输出:
[asd 01]
[00 01]
当遇到多维数组的时候
在多维数组的情况下COPY貌似也不行了,在拷贝数组的时候并没有拷贝子元素数组
func main() {
array1:=[][]string{
{"00","01"},
{"10","11"},
}
array2:=make([][]string, len(array1), len(array1[0]))
copy(array2,array1)
array1[0][0]="asd"
fmt.Println(array1)
fmt.Println(array2)
}
输出:
[[asd 01] [10 11]]
[[asd 01] [10 11]]
在改变子元素数组的时候再copy一次
func main() {
array1:=[][]string{
{"00","01"},
{"10","11"},
}
array2:=make([][]string, len(array1), len(array1[0]))
copy(array2,array1)
as := make([]string, 2)
copy(as,array2[0])
as[0]="asd"
array1[0]=as
fmt.Println(array1)
fmt.Println(array2)
}
输出:
[[asd 01] [10 11]]
[[00 01] [10 11]]
golang深拷贝任意结构代码
func Clone(a, b interface{}) error {
buff := new(bytes.Buffer)
enc := gob.NewEncoder(buff)
dec := gob.NewDecoder(buff)
if err := enc.Encode(a); err != nil {
return err
}
if err := dec.Decode(b); err != nil {
return err
}
return nil
}
再试试
func main() {
array1:=[][]string{
{"00","01"},
{"10","11"},
}
array2:=make([][]string, len(array1), len(array1[0]))
Clone(&array1,&array2)
array1[0][0]="asd"
fmt.Println(array1)
fmt.Println(array2)
}
输出:
[[asd 01] [10 11]]
[[00 01] [10 11]]
最近刚遇到了多维数组切片拷贝的问题所有记录一下....