【愚公系列】2022年08月 Go教学课程 027-深拷贝和浅拷贝

举报
愚公搬代码 发表于 2022/08/31 21:17:42 2022/08/31
【摘要】 一、深拷贝和浅拷贝 1.浅拷贝浅拷贝是指对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。go语言中赋值,函数传参, 函数返回值都是浅拷贝。package mainimport "fmt"func main() { a := []string{"1", "2", "3"} b := a a[0] = "浅拷贝" fmt.Println("a:", a) fmt.Println("...

一、深拷贝和浅拷贝

1.浅拷贝

浅拷贝是指对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。go语言中赋值,函数传参, 函数返回值都是浅拷贝。

package main

import "fmt"

func main() {
	a := []string{"1", "2", "3"}
	b := a
	a[0] = "浅拷贝"
	fmt.Println("a:", a)
	fmt.Println("b:", b)
}

在这里插入图片描述

2.深拷贝

深拷贝是指拷贝对象的具体内容,二内存地址是自主分配的,拷贝结束之后俩个对象虽然存的值是一样的,但是内存地址不一样,俩个对象页互相不影响,互不干涉。

go语言中使用copy()函数来实现引用类型的深拷贝。

语法:
copy(dst[], src[]) //copy(目标切片, 源切片) 将源切片的值拷贝进目标切片。
package main

import "fmt"

func main() {
	a := []string{"1", "2", "3"}
	// 初始化一个空数组
	b := make([]string, len(a), cap(a))
	copy(b, a)
	a[0] = "深拷贝"
	fmt.Println("a:", a)
	fmt.Println("b:", b)
}

在这里插入图片描述

总结

浅拷贝是创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址,引用类型值改变新对象和原本对象都会受到影响。

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,相当于完整复制一份数据和原本物关联。

深拷贝和浅拷贝区别:浅拷贝基本类型之前互不影响,引用类型其中一个对象改变了地址,就会影响另一个对象;深拷贝改变新对象不会影响原对象,他们之前互不影响。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。