go-反射

meigo發表於2022-07-14
chan是什麼型別就能存放什麼型別的資料,我們看看反射,他可不管你什麼型別,隨便傳吧,fmt.Println中傳入任何型別的資料都可以列印
1) 反射可以在執行時動態獲取變數的各種資訊, 比如變數的型別(type),類別(kind)
reflectType(變數名) reflectValue(變數名)
2) 如果是結構體變數,還可以獲取到結構體本身的資訊(包括結構體的欄位、方法)
3) 透過反射,可以修改變數的值,可以呼叫關聯的方法。
func reflectTest01(b interface{}) {
    //透過反射獲取的傳入的變數的 type , kind, 值
    //1. 先獲取到 reflect.Type
    rTyp := reflect.TypeOf(b)
    fmt.Println("rType=", rTyp)
    //2. 獲取到 reflect.Value
    rVal := reflect.ValueOf(b)
    rVal.Elem().SetInt(180)
    fmt.Println(rVal)
}
func main() {
    var num int = 100
    reflectTest01(&num)
    fmt.Println("num=", num)
}
執行結果:
rType= *int
0xc00001e108
num= 180

透過反射的來修改變數, 注意當使用 SetXxx 方法來設定需要透過對應的指標型別來完成, 這樣才能改變傳入的變數的值, 同時需要使用到 reflect.Value.Elem()

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章