Go筆記-Chap10 反射

10.1 類型

反射讓我們能在運(yùn)行期探知對(duì)象的類型信息和內(nèi)存結(jié)構(gòu),從而彌補(bǔ)靜態(tài)語言在動(dòng)態(tài)行為上的不足。反射還是實(shí)現(xiàn)元編程的重要手段。

func TypeOf(i interface{}) Type
func ValueOf(i interface{}) Value

方法Elem返回指針、數(shù)組、切片、字典或通道的基類型

  • 獲取結(jié)構(gòu)體指針的基類型后,遍歷字段
  • 對(duì)于匿名字段,用多級(jí)索引(按定義順序)直接訪問

10.2 值

Value專注于對(duì)象實(shí)例數(shù)據(jù)讀寫
接口遍歷會(huì)復(fù)制對(duì)象,而且unaddressable,所以想修改,要用指針。

func main() {
    a := 100
    va, vp := reflect.ValueOf(a), reflect.ValueOf(&a).Elem()
    fmt.Println(va.CanAddr(), va.CanSet())
    fmt.Println(vp.CanAddr(), vp.CanSet())
}

輸出

false false
true true

就算傳入指針,也要通過Elem獲取目標(biāo)對(duì)象,因?yàn)楸唤涌诖鎯?chǔ)的指針本身不能尋址和進(jìn)行設(shè)置操作

對(duì)非導(dǎo)出字段,不能直接進(jìn)行設(shè)置操作

可通過Interface方法進(jìn)行類型推斷和轉(zhuǎn)換
接口有兩種nil狀態(tài),用IsNil判斷值是否為nil

10.3 方法

動(dòng)態(tài)調(diào)用方法,按In列表準(zhǔn)備好所需參數(shù)。

10.4 構(gòu)建

反射庫提供了內(nèi)置函數(shù)make和new的對(duì)應(yīng)操作,MakeFunc可用來實(shí)現(xiàn)通用模板,適應(yīng)不同數(shù)據(jù)類型。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,680評(píng)論 1 32
  • 第一次知道反射的時(shí)候還是許多年前在學(xué)校里玩 C# 的時(shí)候。那時(shí)總是弄不清楚這個(gè)復(fù)雜的玩意能有什么實(shí)際用途……然后發(fā)...
    勿以浮沙筑高臺(tái)閱讀 1,195評(píng)論 0 9
  • 參考《快學(xué) Go 語言》第 15 課 —— 反射golang reflect反射(一):interface接口的入...
    合肥黑閱讀 1,481評(píng)論 0 18
  • 轉(zhuǎn)載請(qǐng)注明出處:Golang 學(xué)習(xí)筆記(11)—— 反射 介紹 反射是程序執(zhí)行時(shí)檢查其所擁有的結(jié)構(gòu)。尤其是類型的一...
    ChainZhang閱讀 7,715評(píng)論 1 8
  • define 宏替換,編譯階段將前面的宏用后面的值替換掉,用法如下 替換常量,方便修改 替換函數(shù)或者方法 unde...
    youngyunxing閱讀 1,249評(píng)論 0 1

友情鏈接更多精彩內(nèi)容