go语言深拷贝和浅拷贝

%T :使用Go语法输出的值的类型
%v:使用默认格式输出的内置或者自定义类型的值,或者是使用其类型的String()方式输出的自定义值,如果该方法存在的话
%p:以十六进制(基数为16)表示的一个值的地址,前缀为0x,字母使用小写的a-f表示

1、浅复制(1)new()和:=

package main

import "fmt"

type dog struct {
	name string
	age  int
	sex  int
}

func main() {
	dog1 := new(dog)
	dog1.name = "dog1"
	dog1.age = 11
	dog1.sex = -1

	dog2 := dog1

	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)

	dog2.name = "dog2"
	dog2.age = 12
	dog2.sex = 2
	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)
}

go语言深拷贝和浅拷贝_第1张图片

2、浅复制(2)结构名{}和 :=&

package main

import "fmt"

type dog struct {
	name string
	age  int
	sex  int
}

func main() {
	dog1 := dog{
		name: "dog1",
		age:  11,
		sex:  -1,
	}
	dog2 := &dog1

	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)

	dog2.name = "dog2"
	dog2.age = 12
	dog2.sex = 2
	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)
}

在这里插入图片描述

3、浅复制(3) 切片

package main

import (
	"fmt"
	"unsafe"
)

func main() {
	slice_test := []int{1, 2, 3, 4, 5}

	fmt.Println(unsafe.Sizeof(slice_test))
	fmt.Printf("main:%#v,%#v,%#v\n", slice_test, len(slice_test), cap(slice_test))

	slice_value(slice_test)
	fmt.Printf("main:%#v,%#v,%#v\n", slice_test, len(slice_test), cap(slice_test))

	slice_ptr(&slice_test)
	fmt.Printf("main:%#v,%#v,%#v\n", slice_test, len(slice_test), cap(slice_test))

	fmt.Println(unsafe.Sizeof(slice_test))
}

func slice_value(slice_test []int) {
	slice_test[1] = 100                // 函数里的slice确实有被修改
	slice_test = append(slice_test, 6) // 函数外的不变
	fmt.Printf("slice_value:%#v,%#v,%#v\n", slice_test, len(slice_test), cap(slice_test))
}

func slice_ptr(slice_test *[]int) { // 这样才能修改函数外的slice
	(*slice_test)[1] = 10
	*slice_test = append(*slice_test, 7)
	fmt.Printf("slice_ptr:%#v,%#v,%#v\n", *slice_test, len(*slice_test), cap(*slice_test))
}

go语言深拷贝和浅拷贝_第2张图片
unsafe.sizeof()

4、 深复制(1)结构名{}和:=

package main

import "fmt"

type dog struct {
	name string
	age  int
	sex  int
}

func main() {
	dog1 := dog{
		name: "dog1",
		age:  11,
		sex:  -1,
	}
	dog2 := dog1

	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)

	dog2.name = "dog2"
	dog2.age = 12
	dog2.sex = 2
	fmt.Printf("%T %v %p\n", dog1, dog1, dog1)
	fmt.Printf("%T %v %p\n", dog2, dog2, dog2)
}

go语言深拷贝和浅拷贝_第3张图片

你可能感兴趣的:(go语言)