什么是反射?
维基百科中解释为:
反射是指计算机程序在运行时(Run time)可以访问、检测和修改它本身状态或行为的一种能力
通俗来讲就是, go 语言中提供一种机制,可以在代码运行时获取变量的类型和值,这种机制就是反射。有反射那么有“正射“么? “正射“就是我们一般用法:定义变量, 编译时就可以知道变量的类型和值。
反射如何使用
反射主要是reflect包提供,提供的类型和方法如下:
- 类型
reflect.Value : 表示具体值
reflect.Type :表示具体类型,如自己定义的 type Test struct {}, Type 就是Test
reflect.Kind : 表示 特定类型,go中定义的类型 ,如自己定义的 type Test struct {}, Kind 就是 struct
- 方法
reflect.ValueOf() :返回 reflect.Value
reflect.TypeOf(): 返回 reflect.Type
reflect.Value.NumField(): 返回结构体中字段的数量
reflect.Value.Field(i int):返回字段 i 的 reflect.Value
一个例子
package main
import (
"reflect"
"fmt"
)
type Student struct {
Name string
Age int
Sex string
}
func ReflectMethod(v interface{}) {
vValue := reflect.ValueOf(v)
num := vValue.NumField()
for i := 0; i < num ; i ++ {
switch vValue.Field(i).Kind() {
case reflect.String :
fmt.Printf("%s\n", vValue.Field(i))
case reflect.Int :
fmt.Printf("%d\n", vValue.Field(i) )
}
}
}
func main() {
student := Student{
"zhangsan",
18,
"male",
}
ReflectMethod(student)
}
输出:
zhangsan
18
male
反射的使用场景
适合的场景 : 写测试用例的时候可以使用反射
其他场景尽量不要使用反射,原因如下:
1. 业务代码中写反射,会增加复杂性,让人难以理解
2. 反射性能比较低,比正常代码要慢一到两个数量级
3. 反射并不能在编译时检查出错误,在运行时可能会出现panic
所以在正常代码中尽量不要使用反射。