go 深/浅拷贝结构体对象
在 go
中,当我们以 new
或 &
的方式,创建一个 struct
的对象实例后(指针),如果直接使用赋值运算符,则像其他语言一样,会浅拷贝到一个新对象,二者指向的内存地址是相同的。go
并没有类似 clone
这种 深拷贝
操作 关键字
,那如何简单快速的 深拷贝
一个 对象
?
package mainimport (
"encoding/json"
"fmt"
)type Student struct {
Name string
Ageuint8
}func main() {
// 深拷贝 将 stud1 对象 深拷贝出一个 stud2
// stud1 和 stud2 指向了两块内存地址 副本
stud1 := &Student{Name: "sqrtCat", Age: 35}
// 为 tmp 分配新的内存地址
tmp := *stud1
// 将 tmp 的内存地址赋给指针变量 stud2
stud2 := &tmp
stud2.Name = "bigCat"
fmt.Printf("%+v\n%+v\n", stud1, stud2)// 浅拷贝
stud3 := &Student{Name: "sqrtCat", Age: 35}
stud4 := stud3
stud4.Name = "bigCat"
fmt.Printf("%+v\n%+v\n", stud3, stud4)
}
【go 深/浅拷贝结构体对象】还有个指针和变量的小例子可以参阅
package mainimport (
"fmt"
)type HelloService struct {}func (p *HelloService) Hello(request string, reply *string) error {
// reply 是指针
// *reply 是指针指向的变量
*reply = "hello:" + request
return nil
}func main() {
var reply1 *string//变量声明
reply1 = new(string)//空指针 初始化掉reply2 := new(string)//声明+初始化hs := new(HelloService)
hs.Hello("sqrtcat", reply1)
hs.Hello("bigcat", reply2)
fmt.Printf("%v\n%v\n", *reply1, *reply2)
}
推荐阅读
- 深入理解Go之generate
- 由浅入深理解AOP
- 二、抱朴守拙|二、抱朴守拙 涉世之法
- 慢煮岁月,浅思淡行
- 《深度倾听》第5天──「RIA学习力」便签输出第16期
- 【1057快报】深入机关,走下田间,交通普法,共创文明
- 生发知识,带你深入了解
- 这座媲美重庆的绝色山城,深藏国宝级景点,更有绝美高山花海!
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- 我那水深火热的二婚生活