Golang 里的append拷贝

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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值