这里写自定义目录标题

golang深拷贝/浅拷贝

代码如下

package main

import (
	"fmt"
)

type person struct {
	name string
	age  int
	sex  bool
}

func main() {
	// 切片深拷贝
	s1 := []int{1, 2, 5}
	s2 := make([]int, len(s1), len(s1))
	copy(s2, s1)
	s1[2] = 4
	fmt.Printf("s1:%v\t 内存地址:%p\t s1[2]地址:%p\n", s1, &s1, &s1[2]) // s1:[1 2 4]       内存地址:0xc000004078   s1[2]地址:0xc00000e130
	fmt.Printf("s2:%v\t 内存地址:%p\t s2[2]地址:%p\n", s2, &s2, &s2[2]) // s2:[1 2 5]       内存地址:0xc000004090   s2[2]地址:0xc00000e148

	fmt.Println("---------------------")

	// 切片浅拷贝
	a := []int{1, 2, 5}
	b := a
	a[2] = 4
	fmt.Printf("a:%v\t 内存地址:%p\t a[2]地址:%p\n", a, &a, &a[2])
	fmt.Printf("b:%v\t 内存地址:%p\t b[2]地址:%p\n", b, &b, &b[2])

	fmt.Println("---------------------")

	// 结构体深拷贝
	p1 := person{"jack", 10, true}
	p2 := p1
	p1.age = 20
	fmt.Printf("p1:%v\t 内存地址:%p\t p1.age地址:%p\n", p1, &p1, &p1.age)
	fmt.Printf("p2:%v\t 内存地址:%p\t p2.age地址:%p\n", p2, &p2, &p2.age)

	fmt.Println("---------------------")

	// 结构体浅拷贝方式一
	f1 := person{"jack", 10, true}
	f2 := &f1
	f1.age = 20
	fmt.Printf("p1:%v\t 内存地址:%p\t p1.age地址:%p\n", f1, &f1, &f1.age)
	fmt.Printf("p2:%v\t 内存地址:%p\t p2.age地址:%p\n", f2, &f2, &f2.age)

	fmt.Println("---------------------")

	// 结构体浅拷贝方式二
	g1 := new(person)
	g1.name = "tom"
	g1.sex = true
	g1.age = 6
	g2 := g1
	g1.age = 100
	fmt.Printf("g1:%v\t 内存地址:%p\t g1.age地址:%p\n", g1, &g1, &g1.age)
	fmt.Printf("g2:%v\t 内存地址:%p\t g2.age地址:%p\n", g2, &g2, &g2.age)
}