一、根本介绍
- 反射能够在运行时动静获取变量的各种信息,比方变量的类型(type),类别(kind)
- 如果是构造体变量,还能够获取到构造体自身的信息(包含构造体的字段、办法)
- 通过反射,能够批改变量的值,能够调用关联的办法
- 应用反射,须要import("reflect")
二、反射重要的函数和概念
- reflect.TypeOf(变量名),获取变量的类型,返回reflect.Type类型
- reflect.ValueOf(变量名),获取变量的值,返回reflect.Value类型reflect.Value 是一个构造体类型,通过reflect.Value,能够获取到对于该变量的很多信息。
- 变量、interface{}和reflect.Value是能够互相转换的,这在理论开发中,常常用到
var student Studentvar 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()办法