Golang 里的append拷贝

Golang 里的深拷贝

  • Slice

Slice

Slice 是对Array数据的引用 ,当Append的时候会执行复制Array数据的工作。这就存在一个问题,当数据类型是int struct 指针 容器 ,它们对应的复制是复制值,还是复制引用,还是复制整个数据。下面我们分别执行代码看一下

// te project main.go
package main

import (
	"fmt"
)

type myS struct {
	a, b int
}

func main() {
	x := []myS{{1, 1}, {2, 2}, {3, 3}}
	x2 := x[0:1]
	x[0] = myS{9, 9}
	x3 := append(x2, myS{4, 4}, myS{5, 5}, myS{6, 6})
	x2[0] = myS{10, 10}
	fmt.Println(x2)
	fmt.Println(x3)
}

输出:
[{10 10}]
[{9 9} {4 4} {5 5} {6 6}]
结果: struct 类型的数据 被整体复制。

看一下 *struct 指针类型

// te project main.go
package main

import (
	"fmt"
)

type myS struct {
	a, b int
}

func main() {

	x := []*myS{{1, 1}, {2, 2}, {3, 3}}
	x2 := x[0:1]
	x[0].a = 9
	x3 := append(x2, &myS{4, 4}, &myS{5, 5}, &myS{6, 6})
	x2[0].b = 10
	fmt.Println(x)
	fmt.Println(x2)
	for _, v := range x2 {
		fmt.Println(v)
	}
	fmt.Println(x3)
	for _, v := range x3 {
		fmt.Println(v)
	}

}


输出:
[0xc000050080 0xc000050090 0xc0000500a0]
[0xc000050080]
&{9 10}
[0xc000050080 0xc0000500b0 0xc0000500c0 0xc0000500d0]
&{9 10}
&{4 4}
&{5 5}
&{6 6}

结论很清楚了,这是浅copy.

你可能感兴趣的:(Golang)