Golang實現(xiàn)深拷貝reflect原理示例探究
Golang reflect深拷貝
作為CRUD成員,是不是平時reflect使用的很少,一旦使用又不知道如何操作,通過學習本項目,加深對reflect理解。代碼就是100行
通過本項目可以學到什么?
reflect各種基本使用
加深對各種數(shù)據(jù)類型的理解
理解的重點:
reflect.ValueOf()
表示將interface{}
轉成 reflect.Value
結構體,這兩個是等價的關系,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,達到目的。但是一個指針a賦值給指針b,此時a和b指向的是同一個對象,并沒有達到深拷貝的目的。【所以不行】所以我們需要新建一個對象,讓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
對象的值,復制給destValue.Elem()
對象
項目托管地址:https://github.com/gofish2020/deepCopy
以上就是Golang實現(xiàn)深拷貝原理示例探究的詳細內(nèi)容,更多關于Golang 深拷貝的資料請關注腳本之家其它相關文章!
相關文章
5個可以在Golang中優(yōu)化代碼以提高性能的技巧分享
作為一名軟件工程師,確保你的代碼高效且性能良好是非常重要的。本文主要和大家分享5個可以在Golang中優(yōu)化代碼以提高性能的技巧,希望對大家有所幫助2023-03-03golang跳轉語句goto,break,continue的使用及區(qū)別說明
這篇文章主要介紹了golang跳轉語句goto,break,continue的使用及區(qū)別說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12golang實現(xiàn)單點登錄系統(tǒng)(go-sso)
這篇文章主要介紹了golang實現(xiàn)單點登錄系統(tǒng)(go-sso),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-06-06