Golang實(shí)現(xiàn)深拷貝reflect原理示例探究
Golang reflect深拷貝
作為CRUD成員,是不是平時(shí)reflect使用的很少,一旦使用又不知道如何操作,通過學(xué)習(xí)本項(xiàng)目,加深對(duì)reflect理解。代碼就是100行
通過本項(xiàng)目可以學(xué)到什么?
reflect各種基本使用
加深對(duì)各種數(shù)據(jù)類型的理解
理解的重點(diǎn):
reflect.ValueOf()
表示將interface{}
轉(zhuǎn)成 reflect.Value
結(jié)構(gòu)體,這兩個(gè)是等價(jià)的關(guān)系,reflect.Value
的底層就是基于 interface{}
。我們知道接口類型包含兩個(gè):動(dòng)態(tài)類型和動(dòng)態(tài)值,通過reflect.Value
可以方便的獲取這兩個(gè)值。
reflect.New(origianl.Type()).Elem()
表示基于類型,new
了一個(gè)該類型的指針,同時(shí)通過解引用Elem()
該指針,得到該類型的對(duì)象。通過下圖對(duì)比理解:
以這段代碼作為理解范例
代碼解析
copyRecursive
函數(shù)定義:將src的值,賦值給dest
src為指針類型,dest也是指針類型;我們可以直接
dest.Set(src)
,這個(gè)的含義就是將src的值賦值給dest,達(dá)到目的。但是一個(gè)指針a賦值給指針b,此時(shí)a和b指向的是同一個(gè)對(duì)象,并沒有達(dá)到深拷貝的目的?!舅圆恍小?/p>所以我們需要新建一個(gè)對(duì)象,讓dest指針指向這個(gè)新對(duì)象,即可。那這個(gè)新對(duì)象的類型是什么?不就是 src指針指向的對(duì)象的類型嘛。。
original := src.Elem()
就獲取到src指針指向的對(duì)象,類型那就是original.Type()
.所以新建的對(duì)象指針為
destValue := reflect.New(original.Type())
,這個(gè)是不是很類似于C語(yǔ)言中的int *p = new(int)
接下來(lái),那就是讓dest指向這個(gè)新指針即可
dest.Set(destValue)
就是賦值的意思雖然我們
new
了新對(duì)象,并且指向了該對(duì)象,但是該新對(duì)象的值其實(shí)都是初始值的 0值。所以需要繼續(xù)調(diào)用copyRecursive
函數(shù),將original
對(duì)象的值,復(fù)制給destValue.Elem()
對(duì)象
項(xiàng)目托管地址:https://github.com/gofish2020/deepCopy
以上就是Golang實(shí)現(xiàn)深拷貝原理示例探究的詳細(xì)內(nèi)容,更多關(guān)于Golang 深拷貝的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語(yǔ)言結(jié)構(gòu)化日志slog的用法解析
go?1.21.0?版本引入了一個(gè)新的包?log/slog,該包提供了結(jié)構(gòu)化日志的功能,本文小編就來(lái)和大家聊聊log/slog?包的使用,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10golang調(diào)用c實(shí)現(xiàn)的dll接口細(xì)節(jié)分享
這篇文章主要介紹了golang調(diào)用c實(shí)現(xiàn)的dll接口細(xì)節(jié)分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2021-05-05Go語(yǔ)言使用HTTP包創(chuàng)建WEB服務(wù)器的方法
這篇文章主要介紹了Go語(yǔ)言使用HTTP包創(chuàng)建WEB服務(wù)器的方法,結(jié)合實(shí)例形式分析了Go語(yǔ)言基于HTTP包創(chuàng)建WEB服務(wù)器客戶端與服務(wù)器端的實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-07-07淺析Go語(yǔ)言的數(shù)據(jù)類型及數(shù)組
Golang是一種靜態(tài)強(qiáng)類型、編譯型語(yǔ)言。Go?語(yǔ)言語(yǔ)法與?C?相近,但功能上有:內(nèi)存安全,GC(垃圾回收),結(jié)構(gòu)形態(tài)及?CSP-style?并發(fā)計(jì)算。本文主要和大家聊聊Go語(yǔ)言的數(shù)據(jù)類型及數(shù)組,希望對(duì)大家有所幫助2022-11-11go編譯標(biāo)簽build?tag注釋里語(yǔ)法詳解
這篇文章主要為大家介紹了go編譯標(biāo)簽build?tag注釋里語(yǔ)法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09Golang設(shè)計(jì)模式中抽象工廠模式詳細(xì)講解
抽象工廠模式用于生成產(chǎn)品族的工廠,所生成的對(duì)象是有關(guān)聯(lián)的。如果抽象工廠退化成生成的對(duì)象無(wú)關(guān)聯(lián)則成為工廠函數(shù)模式。比如本例子中使用RDB和XML存儲(chǔ)訂單信息,抽象工廠分別能生成相關(guān)的主訂單信息和訂單詳情信息2023-01-01