我們在開發中會經常的把乙個變數複製給另乙個變數,那麼這個過程,可能是深淺拷貝,那麼今天幫大家區分一下這兩個拷貝的區別和具體的區別。
一、概念
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...