亚洲熟女综合色一区二区三区,亚洲精品中文字幕无码蜜桃,亚洲va欧美va日韩va成人网,亚洲av无码国产一区二区三区,亚洲精品无码久久久久久久

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

要想搞明白深拷貝和淺拷貝的區(qū)別,我們需要先弄懂以下幾點(diǎn):

一、值類型和引用類型

Go 語言里面變量有兩類,一類是值類型,一類是引用類型。

兩者區(qū)別是什么呢?

我們?cè)陔娔X里面創(chuàng)建的變量,都是需要內(nèi)存來存放的。

值變量就是直接,一個(gè)內(nèi)存地址對(duì)應(yīng)一個(gè)值。

而引用變量,則是某個(gè)值存放的是另一個(gè)值的地址。

我畫了一個(gè)邏輯圖,幫助我們?nèi)ダ斫膺@個(gè)概念。

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

在 Go 語言中:

  • string、int、bool、float 等這些都屬于值類型
  • slice、map、chan 等這些都屬于引用類型

二、什么是淺拷貝和深拷貝?

而我們提到的深拷貝和淺拷貝,則指的是引用類型的值處理方案。

淺拷貝指的是,把變量里面存的內(nèi)存地址拷貝了,所指向的真實(shí)值并沒拷貝。

像下面這張圖:

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

0x004 淺拷貝到了 0x003 里面,實(shí)際上只是拷貝了一個(gè) 0x006 這個(gè)內(nèi)存地址。

代碼是怎么實(shí)現(xiàn)的呢?

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

怎么去證明是淺拷貝呢?

我們現(xiàn)在去改變下 a 切片里面的值:

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

你會(huì)發(fā)現(xiàn)我改了 a 里面的值,b 里面的值同樣被改了。

為什么會(huì)這樣呢?

Go 的底層,slice 他其實(shí)是一個(gè)特殊的結(jié)構(gòu)體,他包含三個(gè)字段:

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

這個(gè)數(shù)組里面的 array 才是真實(shí)數(shù)組值的存放地址。

三、如何實(shí)現(xiàn)深拷貝?

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

Go語言中淺拷貝和深拷貝的區(qū)別是什么?

我們?cè)诔跏蓟?b 數(shù)組的時(shí)候,我們需要指定數(shù)組的長度和容量,你可以直接 ?b := make([]string, 3)?但是我們并不建議這樣去寫。

這樣我們創(chuàng)建出來的 b ,就是獨(dú)立的一個(gè)數(shù)組切片了。

你學(xué)廢了么?

原文:https://mp.weixin.qq.com/s/uSOBfOLN4j3_VQtxHtJEWQ

相關(guān)新聞

歷經(jīng)多年發(fā)展,已成為國內(nèi)好評(píng)如潮的Linux云計(jì)算運(yùn)維、SRE、Devops、網(wǎng)絡(luò)安全、云原生、Go、Python開發(fā)專業(yè)人才培訓(xùn)機(jī)構(gòu)!