1、基本介紹
- 反射能夠在運行時動態獲取變量的各類信息,好比變量的類型(type),類別(kind)
- 若是是結構體變量,還能夠獲取到結構體自己的信息(包括結構體的字段、方法)
- 經過反射,能夠修改變量的值,能夠調用關聯的方法
- 使用反射,須要import("reflect")
2、反射重要的函數和概念
- reflect.TypeOf(變量名),獲取變量的類型,返回reflect.Type類型
- reflect.ValueOf(變量名),獲取變量的值,返回reflect.Value類型reflect.Value 是一個結構體類型,經過reflect.Value,能夠獲取到關於該變量的不少信息。
- 變量、interface{}和reflect.Value是能夠相互轉換的,這在實際開發中,常常用到
var student Student
var number int
//專門作反射
func test(b interface{}) {
// 1.如何將interface{} 轉成reflect.Value
rval = reflect.ValueOf(b)
// 2.如何將reflect.ValueOf轉爲interface{}
iVal := rVal.Interface{}
// 3.如何將interface{}轉成原來的變量類型,使用類型斷言便可
v := iVal.(Student)
}
3、常量
- 常量使用const修飾
- 常量在定義的時候,必須初始化
- 常量不能修改
- 常量只能修飾bool、數值類型(int、float系列)、string類型
- 語法:const identifier [type] = value
4、反射注意事項和細節說明
- reflect.Value.Kind,獲取變量的類別,返回的是一個常量
- Type是類型,Kind是類別,Type和Kind可能相同也可能不一樣好比:var number int 的Type和Kind都是int,好比:var stu Student stu的Type是包名.Student,Kind是struct
- 經過反射可讓變量在interface{}和Reflect.Value之間相互轉換,
變量<---->interface{}<---->reflect.Value
- 使用反射的方式獲取變量的值(並返回相應的類型),要求數據類型匹配,好比x是int,那麼就應該使用reflect.Value(x).Int(),而不能使用其餘
- 經過反射來修改變量,注意當使用Setxxx方法來設置須要經過對應的指針類型來完成,同事須要使用到reflect.Value.Elem()方法