目录
反射
基本概念
反射是指在程序运行期对程序本身进行访问和修改的能力。Golang反射是通过接口来实现的,通过隐式转换,普通的类型被转换成interface类型,这个过程涉及到类型转换的过程,首先从Golang类型转为interface类型, 再从interface类型转换成反射类型, 再从反射类型得到想的类型和值的信息。
变量的内在机制
- 变量包含类型信息和值信息 var arr [10]int arr[0] = 10
- 类型信息:是静态的元信息,是预先定义好的
- 值信息:是程序运行过程中动态改变的
Go的反射三定律
- Golang对象可以转换成反射对象
- 反射对象可以转换成Golang对象
- 可寻址的reflect对象可以更新值
反射的使用
- reflect包封装了反射相关的方法
- 获取类型信息:reflect.TypeOf,返回reflect.Type类型
- 获取值信息:reflect.ValueOf,返回reflect.Value类型
- reflect.Value.Kind,获取变量的类别,返回一个常量
- reflect.Value.Interface(),转换成interface{}类型
空接口与反射
- 反射可以在运行时动态获取程序的各种详细信息
- 反射获取interface类型信息
package main import ( "fmt" "reflect" ) //反射获取interface类型信息 func reflect_type(a interface{}) { t := reflect.TypeOf(a) fmt.Println("类型是:", t) // kind()可以获取具体类型 k := t.Kind() fmt.Println(k) switch k { case reflect.Float64: fmt.Printf("a is float64\n") case reflect.String: fmt.Println("string") } } func main() { var x float64 = 3.4 reflect_type(x) }