go语言深拷贝和浅拷贝 - Go语言中文社区

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 %pn", dog1, dog1, dog1)
	fmt.Printf("%T %v %pn", dog2, dog2, dog2)

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

在这里插入图片描述

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 %pn", dog1, dog1, dog1)
	fmt.Printf("%T %v %pn", dog2, dog2, dog2)

	dog2.name = "dog2"
	dog2.age = 12
	dog2.sex = 2
	fmt.Printf("%T %v %pn", dog1, dog1, dog1)
	fmt.Printf("%T %v %pn", 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,%#vn", slice_test, len(slice_test), cap(slice_test))

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

	slice_ptr(&slice_test)
	fmt.Printf("main:%#v,%#v,%#vn", 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,%#vn", 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,%#vn", *slice_test, len(*slice_test), cap(*slice_test))
}

在这里插入图片描述
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 %pn", dog1, dog1, dog1)
	fmt.Printf("%T %v %pn", dog2, dog2, dog2)

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

在这里插入图片描述

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_44001521/article/details/105614113
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢