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ù)類型。