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