Go語言講解深拷貝與淺拷貝

2022-08-24 01:48:11 字數 1839 閱讀 3200

我們在開發中會經常的把乙個變數複製給另乙個變數,那麼這個過程,可能是深淺拷貝,那麼今天幫大家區分一下這兩個拷貝的區別和具體的區別。

一、概念

1、深拷貝(deep copy):

拷貝的是資料本身,創造乙個樣的新物件,新建立的物件與原物件不共享記憶體,新建立的物件在記憶體中開闢乙個新的記憶體位址,新物件值修改時不會影響原物件值。既然記憶體位址不同,釋放記憶體位址時,可分別釋放。

值型別的資料,預設全部都是深複製,array、int、string、struct、float,bool。

2、淺拷貝(shallow copy):

拷貝的是資料位址,只複製指向的物件的指標,此時新物件和老物件指向的記憶體位址是一樣的,新物件值修改時老物件也會變化。釋放記憶體位址時,同時釋放記憶體位址。

引用型別的資料,預設全部都是淺複製,slice,map。

二、本質區別:

是否真正獲取(複製)物件實體,而不是引用。

三、如何理解?

這裡舉個例子,比如p2複製了p1,修改p1屬性的時候,觀察p2的屬性是否會產生變化

1、p2的屬性變化了,說明這是淺拷貝,堆中記憶體還是同乙個值。

p2=&p1 // 淺拷貝,p2為指標,p1和p2共用乙個記憶體位址

2、p2的屬性沒變化,說明這是深拷貝,堆中記憶體是不同的值了。

package main

import (

"fmt"

)// 定義乙個robot結構體

type robot struct

func main()

robot2 := robot1

fmt.println("修改robot1的name屬性值")

robot1.name = "小白-x型-v1.1"

}

執行結果:

深拷貝 內容一樣,改變其中乙個物件的值時,另乙個不會變化。

修改robot1的name屬性值

深拷貝中,我們可以看到robot1號的位址與robot2號的記憶體位址是不同的,修改robot1號的name屬性時,robot2號不會變化。

淺拷貝我們用兩種方式來介紹。

淺拷貝示例1:

package main

import (

"fmt"

)// 定義乙個robot結構體

type robot struct

func main()

robot2 := &robot1

fmt.println("在這裡面修改robot1的name和color屬性")

robot1.name = "小黑-x型-v1.1"

robot1.color = "黑色"

}

執行結果1:

淺拷貝 內容和記憶體位址一樣,改變其中乙個物件的值時,另乙個同時變化。

在這裡面修改robot1的name和color屬性

淺拷貝中,我們可以看到robot1和robot2的記憶體位址是相同的,修改其中乙個物件的屬性時,另乙個也會產生變化。

淺拷貝示例2:

package main

import (

"fmt"

)// 定義乙個robot結構體

type robot struct

func main()

執行結果:

淺拷貝 使用new方式

在這裡面修改robot1的name和color屬性

new操作,robot2 := robot1,看上去是深拷貝,其實是淺拷貝,robot2和robot1兩個指標共用同乙個記憶體位址。

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

我們在開發中會經常的把乙個變數複製給另乙個變數,那麼這個過程,可能是深淺拷貝,那麼今天幫大家區分一下這兩個拷貝的區別和具體的區別。1 深拷貝 deep copy 拷貝的是資料本身,創造乙個樣的新物件,新建立的物件與原物件不共享記憶體,新建立的物件在記憶體中開闢乙個新的記憶體位址,新物件值修改時不會影...

淺拷貝與深拷貝講解

如果b複製了a,修改b時如果a也跟隨b發生改變,那麼這個就是淺拷貝,舉個在生活中的例子,就好比一台電腦,被人遠端連線了,雖然感覺是變成了兩個電腦而且都有相同的內容,但是其實電腦的內容存在的硬碟是乙個,不管是遠端連線的人對電腦進行修改還是本機進行修改,都會影響雙方的電腦。如果b複製了a,修改b,a沒用...

C語言 淺拷貝與深拷貝

淺拷貝 表層的引用,實際指向同一塊記憶體 深拷貝 存放在不同的記憶體空間當中 typedef structstudent student stu1 student stu2 stu1.name kkk stu1.age 20 stu2 stu1 printf stu1 addr p,addr stu...