Go語言中淺拷貝和深拷貝的區別是什么?
要想搞明白深拷貝和淺拷貝的區別,我們需要先弄懂以下幾點:
一、值類型和引用類型
Go 語言里面變量有兩類,一類是值類型,一類是引用類型。
兩者區別是什么呢?
我們在電腦里面創建的變量,都是需要內存來存放的。
值變量就是直接,一個內存地址對應一個值。
而引用變量,則是某個值存放的是另一個值的地址。
我畫了一個邏輯圖,幫助我們去理解這個概念。
在 Go 語言中:
-
string、int、bool、float 等這些都屬于值類型 -
slice、map、chan 等這些都屬于引用類型
二、什么是淺拷貝和深拷貝?
而我們提到的深拷貝和淺拷貝,則指的是引用類型的值處理方案。
淺拷貝指的是,把變量里面存的內存地址拷貝了,所指向的真實值并沒拷貝。
像下面這張圖:
0x004 淺拷貝到了 0x003 里面,實際上只是拷貝了一個 0x006 這個內存地址。
代碼是怎么實現的呢?
怎么去證明是淺拷貝呢?
我們現在去改變下 a 切片里面的值:
你會發現我改了 a 里面的值,b 里面的值同樣被改了。
為什么會這樣呢?
Go 的底層,slice 他其實是一個特殊的結構體,他包含三個字段:
這個數組里面的 array 才是真實數組值的存放地址。
三、如何實現深拷貝?
在 Go 里面我們只需要使用 copy 即可:
我們在初始化 b 數組的時候,我們需要指定數組的長度和容量,你可以直接 ?b := make([]string, 3)
?但是我們并不建議這樣去寫。
這樣我們創建出來的 b ,就是獨立的一個數組切片了。
你學廢了么?
原文:https://mp.weixin.qq.com/s/uSOBfOLN4j3_VQtxHtJEWQ