Golang 里的深拷贝
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.