一、引言
在学习 Java 时,反射一直是个重点掌握内容,ORM 等框架的实现更是与反射息息相关;
Go 语言同样提供了对反射的支持,json 序列化库就是基于反射来工作的;
基于反射,我们不仅能够获得变量的类型信息,而且能够动态修改变量内部的字段值。
二、反射的使用
我们就使用简单的代码,最快地验证下反射功能
package main
import (
"reflect"
"fmt"
)
type Student struct {
Name string
Age int
}
func main() {
student := Student{"xiaoming", 5}
fmt.Println("Check origin value:")
fmt.Println("\t", student)
v := reflect.ValueOf(&student)
t := v.Type() // 也可以使用 t := reflect.TypeOf(&student)
// 打印 student 的所有属性名称和类型(获取属性信息)
fmt.Println("Get fields:")
for i := 0; i < t.Elem().NumField(); i++ {
field := t.Elem().Field(i)
fmt.Println("\t", field.Name, field.Type)
}
// 设置 age 为 10 (修改属性值)
v.Elem().FieldByName("Age").SetInt(10)
fmt.Println("Check new value:")
fmt.Println("\t", student)
// 将反射 Value 对象还原为原变量
ss := v.Interface()
fmt.Println("Change to origin variable:")
fmt.Println("\t", ss)
}
以上就是 go 反射的基本使用方法了!
附上反射转换关系图一张: