淺拷貝和深拷貝的區別 Go語言講解深拷貝與淺拷貝

2021-10-12 06:27:06 字數 1958 閱讀 9168

我們在開發中會經常的把乙個變數複製給另乙個變數,那麼這個過程,可能是深淺拷貝,那麼今天幫大家區分一下這兩個拷貝的區別和具體的區別。1、深拷貝(deep copy):拷貝的是資料本身,創造乙個樣的新物件,新建立的物件與原物件不共享記憶體,新建立的物件在記憶體中開闢乙個新的記憶體位址,新物件值修改時不會影響原物件值。既然記憶體位址不同,釋放記憶體位址時,可分別釋放。值型別的資料,預設全部都是深複製,array、int、string、struct、float,bool。2、淺拷貝記憶體位址是一樣的,新物件值修改時老物件也會變化。釋放記憶體位址時,同時釋放記憶體位址。引用型別的資料,預設全部都是淺複製,slice,map。是否真正獲取(複製)物件實體,而不是引用。這裡舉個例子,比如p2複製了p1,修改p1屬性的時候,觀察p2的屬性是否會產生變化1、p2的屬性變化了,說明這是淺拷貝,堆中記憶體還是同乙個值。

p2=&p1 // 淺拷貝,p2為指標,p1和p2共用乙個記憶體位址
2、p2的屬性沒變化,說明這是深拷貝,堆中記憶體是不同的值了。
p2=p1 // 深拷貝,生成兩個記憶體位址
深拷貝示例:
package mainimport ("fmt")// 定義乙個robot結構體type robot structfunc main()robot2 := robot1fmt.println("修改robot1的name屬性值")robot1.name = "小白-x型-v1.1"}
執行結果:
深拷貝 內容一樣,改變其中乙個物件的值時,另乙個不會變化。修改robot1的name屬性值
深拷貝中,我們可以看到robot1號的位址與robot2號的記憶體位址是不同的,修改robot1號的name屬性時,robot2號不會變化。淺拷貝我們用兩種方式來介紹。淺拷貝示例1:執行結果1:
淺拷貝 內容和記憶體位址一樣,改變其中乙個物件的值時,另乙個同時變化。在這裡面修改robot1的name和color屬性
淺拷貝中,我們可以看到robot1和robot2的記憶體位址是相同的,修改其中乙個物件的屬性時,另乙個也會產生變化。淺拷貝示例2:
package mainimport ("fmt")// 定義乙個robot結構體type robot structfunc main()
執行結果:
淺拷貝 使用new方式在這裡面修改robot1的name和color屬性
new操作,robot2 := robot1,看上去是深拷貝,其實是淺拷貝,robot2和robot1兩個指標共用同乙個記憶體位址。

推薦閱讀

深拷貝和淺拷貝的區別

retain屬性表示兩個物件位址相同 建立乙個指標,指標拷貝 內容當然相同,這個物件的retain值 1也就是說,retain 是指標拷貝 淺拷貝 copy 是內容拷貝 深拷貝 ios中並不是所有的物件都支援copy,mutablecopy,遵守nscopying 協議的類可以傳送copy訊息,遵守...

深拷貝和淺拷貝的區別

一.深拷貝 源物件和副本物件是不同的兩個物件 源物件引用計數不變,副本物件計數器為1 因為是新產生的 至少有一層是物件複製 二.淺拷貝 源物件和副本物件是同乙個物件 源物件 副本物件 引用計數器 1,相當於做一次retain操作 本質 沒有產生新的物件 三.完全複製 對於被複製的物件每一層都是物件複...

深拷貝和淺拷貝的區別

深淺拷貝的區別 淺拷貝是將原始物件中的資料型字段拷貝到新物件中去,將引用型字段的 引用 複製到新物件中去,不把 引用的物件 複製進去,所以原始物件和新物件引用同一物件,新物件中的引用型字段發生變化會導致原始物件中的對應欄位也發生變化。深拷貝是在引用方面不同,深拷貝就是建立乙個新的和原始欄位的內容相同...