- 反射能够在运行时动静获取变量的各种信息,比方变量的类型 (type),类别 (kind)
- 如果是构造体变量,还能够获取到构造体自身的信息(包含构造体的字段、办法)
- 通过反射,能够批改变量的值,能够调用关联的办法
- 应用反射,须要 import(“reflect”)
- 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)
}
- 常量应用 const 润饰
- 常量在定义的时候,必须初始化
- 常量不能批改
- 常量只能润饰 bool、数值类型 (int、float 系列)、string 类型
- 语法:const identifier [type] = value
- 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() 办法