golang数组切片拷贝问题

golang数组切片拷贝问题

Scroll Down

数组切片传递

数组在传递中采用引用传递,即使重新赋值也是只是复制他的一份内存地址
例如:

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]]

最近刚遇到了多维数组切片拷贝的问题所有记录一下....