写点什么

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

作者:愚公搬代码
  • 2022-10-13
    福建
  • 本文字数:625 字

    阅读完需:约 2 分钟

一、深拷贝和浅拷贝

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)}
复制代码


总结

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


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


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

发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2022-03-01 加入

该博客包括:.NET、Java、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、python、大数据等相关使用及进阶知识。查看博客过程中,如有任何问题,皆可随时沟通。

评论

发布
暂无评论
【愚公系列】2022年10月 Go教学课程 027-深拷贝和浅拷贝_10月月更_愚公搬代码_InfoQ写作社区