毕业论文
您现在的位置: 语言识别 >> 语言识别前景 >> 正文 >> 正文

Go语言中浅拷贝和深拷贝的区别是什么

来源:语言识别 时间:2022/6/12

要想搞明白深拷贝和浅拷贝的区别,我们需要先弄懂以下几点:

一、值类型和引用类型

Go语言里面变量有两类,一类是值类型,一类是引用类型。

两者区别是什么呢?

我们在电脑里面创建的变量,都是需要内存来存放的。

值变量就是直接,一个内存地址对应一个值。

而引用变量,则是某个值存放的是另一个值的地址。

我画了一个逻辑图,帮助我们去理解这个概念。

在Go语言中:

string、int、bool、float等这些都属于值类型slice、map、chan等这些都属于引用类型二、什么是浅拷贝和深拷贝?

而我们提到的深拷贝和浅拷贝,则指的是引用类型的值处理方案。

浅拷贝指的是,把变量里面存的内存地址拷贝了,所指向的真实值并没拷贝。

像下面这张图:

0x浅拷贝到了0x里面,实际上只是拷贝了一个0x这个内存地址。

代码是怎么实现的呢?

funcmain(){a:=[]string{"1","2","3"}b:=afmt.Println("a:",a)fmt.Println("b:",b)}//执行结果$goruncp.goa:[]b:[]

怎么去证明是浅拷贝呢?

我们现在去改变下a切片里面的值:

funcmain(){a:=[]string{"1","2","3"}b:=aa[0]="ko"fmt.Println("a:",a)fmt.Println("b:",b)}//执行结果$goruncp.goa:[ko23]b:[ko23]

你会发现我改了a里面的值,b里面的值同样被改了。

为什么会这样呢?

Go的底层,slice他其实是一个特殊的结构体,他包含三个字段:

//AnotInHeapSliceisaslicebackedbygo:notinheapmemory.typenotInHeapSlicestruct{array*notInHeaplenintcapint}

这个数组里面的array才是真实数组值的存放地址。

三、如何实现深拷贝?

在Go里面我们只需要使用copy即可:

funcmain(){a:=[]string{"1","2","3"}//初始化一个空数组b:=make([]string,len(a),cap(a))copy(b,a)a[0]="ko"fmt.Println("a:",a)fmt.Println("b:",b)}//执行结果$goruncp.goa:[ko23]b:[]

我们在初始化b数组的时候,我们需要指定数组的长度和容量,你可以直接b:=make([]string,3)但是我们并不建议这样去写。

这样我们创建出来的b,就是独立的一个数组切片了。

你学废了么?

原文:

转载请注明:http://www.0431gb208.com/sjsbszl/565.html