当前位置: 首页 > 科技观察

一篇学习深拷贝和浅拷贝的文章

时间:2023-03-14 15:00:41 科技观察

1。什么是复制?当你将变量a赋值给变量b时,你实际上是在将变量a复制到变量b。a:="hello"b:=a这只是复制最简单的形式,但有些形式非常隐蔽。例如:你将参数传递给一个函数,你将对象传递给一个通道,这些实际上会在Go编译器中被复制。2、什么是深拷贝和浅拷贝?知道什么是copy,我们再深挖一下,说说deep和shallowcopy。不过别着急,我们先来了解一下这两种数据结构:值类型:String、Array、Int、Struct、Float、Bool引用类型:Slice、Map有时候效果完全不一样,这可能是很多人的坑新手。对于值类型,每次复制,Go都会申请一块新的内存空间来存放它的值,改变其中一个变量不会影响另一个变量。funcmain(){aArr:=[3]int{0,1,2}fmt.Printf("打印aArr:%v\n",aArr)bArr:=aArraArr[0]=88fmt.Println("复制aArr之后给bArr,修改aArr[0]=88")fmt.Printf("printaArr:%v\n",aArr)fmt.Printf("printbArr:%v\n",bArr)}从输出结果看,aArr和bArr相互独立,互不干扰PrintaArr:[012]将aArr复制到bArr后,修改aArr[0]=88PrintaArr:[8812]PrintbArr:[012]用于引用类型,每次复制,Go都不会申请新的内存空间,而是使用它的指针。这两个变量名实际上指向同一个内存空间。改变其中一个变量将直接影响另一个变量。funcmain(){aslice:=[]int{0,1,2}fmt.Printf("打印aslice:%v\n",aslice)bslice:=asliceaslice[0]=88fmt.Println("复制aslice到Afterbslice,修改aslice[0]=88")fmt.Printf("printaslice:%v\n",aslice)fmt.Printf("printbslice:%v\n",bslice)}从输出结果看,aslice的更新直接体现在bslice的值上。Printaslice:[012]将aslice复制成bslice后,修改aslice[0]=88Printaslice:[8812]Printbslice:[8812]是不是很简单?跟着鸣哥征服围棋的每一个角落加油,我们看下一篇。本文转载自微信公众号“编程时间”,可通过以下二维码关注。转载本文请联系围棋编程时间公众号。