Golang實現(xiàn)深拷貝reflect原理示例探究
Golang reflect深拷貝
作為CRUD成員,是不是平時reflect使用的很少,一旦使用又不知道如何操作,通過學習本項目,加深對reflect理解。代碼就是100行
通過本項目可以學到什么?
reflect各種基本使用
加深對各種數據類型的理解
理解的重點:
reflect.ValueOf()
表示將interface{}轉成 reflect.Value結構體,這兩個是等價的關系,reflect.Value的底層就是基于 interface{}。我們知道接口類型包含兩個:動態(tài)類型和動態(tài)值,通過reflect.Value可以方便的獲取這兩個值。
reflect.New(origianl.Type()).Elem()
表示基于類型,new了一個該類型的指針,同時通過解引用Elem()該指針,得到該類型的對象。通過下圖對比理解:

以這段代碼作為理解范例
代碼解析
copyRecursive 函數定義:將src的值,賦值給dest
src為指針類型,dest也是指針類型;我們可以直接
dest.Set(src),這個的含義就是將src的值賦值給dest,達到目的。但是一個指針a賦值給指針b,此時a和b指向的是同一個對象,并沒有達到深拷貝的目的?!舅圆恍小?/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ù)調用copyRecursive函數,將original對象的值,復制給destValue.Elem()對象

項目托管地址:https://github.com/gofish2020/deepCopy
以上就是Golang實現(xiàn)深拷貝原理示例探究的詳細內容,更多關于Golang 深拷貝的資料請關注腳本之家其它相關文章!
相關文章
golang調用c實現(xiàn)的dll接口細節(jié)分享
這篇文章主要介紹了golang調用c實現(xiàn)的dll接口細節(jié)分享,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05
Go語言使用HTTP包創(chuàng)建WEB服務器的方法
這篇文章主要介紹了Go語言使用HTTP包創(chuàng)建WEB服務器的方法,結合實例形式分析了Go語言基于HTTP包創(chuàng)建WEB服務器客戶端與服務器端的實現(xiàn)方法與相關注意事項,需要的朋友可以參考下2016-07-07

