Golang實現(xiàn)深拷貝reflect原理示例探究
Golang reflect深拷貝
作為CRUD成員,是不是平時reflect使用的很少,一旦使用又不知道如何操作,通過學(xué)習(xí)本項目,加深對reflect理解。代碼就是100行
通過本項目可以學(xué)到什么?
reflect各種基本使用
加深對各種數(shù)據(jù)類型的理解
理解的重點:
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?metrics各個指標(biāo)含義講解說明
這篇文章主要為大家介紹了golang?metrics各個指標(biāo)含義講解說明,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05
Golang測試func?TestXX(t?*testing.T)的使用詳解
一般Golang中的測試代碼都以xxx_test.go的樣式,在命名測試函數(shù)的時候以Testxx開頭,下面給大家介紹Golang測試func?TestXX(t?*testing.T)的使用,感興趣的朋友跟隨小編一起看看吧2024-08-08
go語言里面實現(xiàn)并發(fā)安全扣減庫存的幾種方式小結(jié)
本文介紹了GORM框架中的幾種高級查詢技巧,包括隨機返回數(shù)據(jù)的方法,鎖機制的使用,Upsert操作,在gorm-gen中使用原生SQL查詢這幾種方法,具有一定的參考價值,感興趣的可以了解一下2026-04-04

