一、概念
二、本质区别:
三、如何理解?
p2=&p1 浅拷贝,p2为指针,p1和p2共用一个内存地址
p2=p1 深拷贝,生成两个内存地址
四、演示示例:
package mainimport ("fmt")// 定义一个Robot结构体type Robot struct {Name stringColor stringModel string}func main() {fmt.Println("深拷贝 内容一样,改变其中一个对象的值时,另一个不会变化。")robot1 := Robot{Name: "小白-X型-V1.0",Color: "白色",Model: "小型",}robot2 := robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, &robot2)fmt.Println("修改Robot1的Name属性值")robot1.Name = "小白-X型-V1.1"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, &robot2)}
深拷贝 内容一样,改变其中一个对象的值时,另一个不会变化。Robot 1:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072330Robot 2:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072360修改Robot1的Name属性值Robot 1:{小白-X型-V1.1 白色 小型} 内存地址:0xc000072330Robot 2:{小白-X型-V1.0 白色 小型} 内存地址:0xc000072360
package mainimport ("fmt")// 定义一个Robot结构体type Robot struct {Name stringColor stringModel string}func main() {fmt.Println("浅拷贝 内容和内存地址一样,改变其中一个对象的值时,另一个同时变化。")robot1 := Robot{Name: "小白-X型-V1.0",Color: "白色",Model: "小型",}robot2 := &robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)fmt.Println("在这里面修改Robot1的Name和Color属性")robot1.Name = "小黑-X型-V1.1"robot1.Color = "黑色"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, &robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)}
浅拷贝 内容和内存地址一样,改变其中一个对象的值时,另一个同时变化。Robot 1:{小白-X型-V1.0 白色 小型} 内存地址:0xc000062330Robot 2:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000062330在这里面修改Robot1的Name和Color属性Robot 1:{小黑-X型-V1.1 黑色 小型} 内存地址:0xc000062330Robot 2:&{小黑-X型-V1.1 黑色 小型} 内存地址:0xc000062330
package mainimport ("fmt")// 定义一个Robot结构体type Robot struct {Name stringColor stringModel string}func main() {fmt.Println("浅拷贝 使用new方式")robot1 := new(Robot)robot1.Name = "小白-X型-V1.0"robot1.Color = "白色"robot1.Model = "小型"robot2 := robot1fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)fmt.Println("在这里面修改Robot1的Name和Color属性")robot1.Name = "小蓝-X型-V1.2"robot1.Color = "蓝色"fmt.Printf("Robot 1:%s\t内存地址:%p \n", robot1, robot1)fmt.Printf("Robot 2:%s\t内存地址:%p \n", robot2, robot2)}
浅拷贝 使用new方式Robot 1:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000068330Robot 2:&{小白-X型-V1.0 白色 小型} 内存地址:0xc000068330在这里面修改Robot1的Name和Color属性Robot 1:&{小黑-X型-V1.2 黑色 小型} 内存地址:0xc000068330Robot 2:&{小黑-X型-V1.2 黑色 小型} 内存地址:0xc000068330
文章转载自go技术沙龙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




