值类型是深拷贝,深拷贝就是为新的对象分配了内存。引用类型是浅拷贝,浅拷贝只是复制了对象的指针。
例 :深拷贝和浅拷贝。
package main
import (
"fmt"
)
//定义结构体Dog
type Dog struct {
Name string
Color string
Age int
Kind string
}
func main() {
//1.实现结构体的深拷贝
//struct是值类型,默认的复制就是深拷贝
d1 := Dog{"豆豆", "黑色", 2, "二哈"}
fmt.Printf("d1 :%T,%v,%p \n", d1, d1, &d1)
d2 := d1 //深拷贝
fmt.Printf("d2 :%T,%v,%p \n", d2, d2, &d2)
d2.Name = "毛毛"
fmt.Println("d2修改后:", d2)
fmt.Println("d1 :", d1)
fmt.Println("====================================")
//实现结构体浅拷贝,直接赋值指针地址
d3 := &d1
fmt.Printf("d3:%T,%v,%p\n", d3, d3, d3)
d3.Name = "球球"
d3.Color = "白色"
d3.Age = 3
d3.Kind = "萨摩耶"
fmt.Println("d3修改后:", d3)
fmt.Println("d1 :", d1)
fmt.Println("====================================")
//实现结构体浅拷贝,通过new()函数来实例化对象
d4 := new(Dog)
d4.Name = "多多"
d4.Color = "棕色"
d4.Age = 1
d4.Kind = "巴哥犬"
d5 := d4
fmt.Printf("d4:%T,%v,%p\n", d4, d4, d4)
fmt.Printf("d5:%T,%v,%p\n", d5, d5, d5)
d5.Color = "金色"
d5.Kind = "金毛"
fmt.Println("d5修改后:", d5)
fmt.Println("d4:", d4)
}
运行结果:
d1 :main.Dog,{豆豆 黑色 2 二哈},0xc000026080
d2 :main.Dog,{豆豆 黑色 2 二哈},0xc000026140
d2修改后: {毛毛 黑色 2 二哈}
d1 : {豆豆 黑色 2 二哈}
====================================
d3:*main.Dog,&{豆豆 黑色 2 二哈},0xc000026080
d3修改后: &{球球 白色 3 萨摩耶}
d1 : {球球 白色 3 萨摩耶}
====================================
d4:*main.Dog,&{多多 棕色 1 巴哥犬},0xc000026340
d5:*main.Dog,&{多多 棕色 1 巴哥犬},0xc000026340
d5修改后: &{多多 金色 1 金毛}
d4: &{多多 金色 1 金毛}