Go的反射

反射
1 反射可以在运行时动态获取变量的各种信息, 比如变量的类型(type),类别(kind)
2.如果是结构体变量,还可以获取到结构体本身的信息(包括结构体的字段、方法)
3 通过反射,可以修改变量的值,可以调用关联的方法。
4 使用反射,需要 import (“reflect”)
反射使用TypeOf和ValueOf函数从接口中获取目标对象的信息,轻松完成目的
字符串反射
var name string =” jack lee”
reflectType := reflect.TypeOf(name) //string 动态获取输入参数接口中的值的类型
reflectValue := reflect.ValueOf(name) // jack lee 获取输入参数接口中的数据的值
struct 反射
type jack struct {
Id int
Name string
}
func (s jack) Hello(){
fmt.Println(“我是一个学生”)
}
func (s jack) Hi(){
fmt.Println(“晚上好”)
}
func main() {
s := jack{Id: 1, Name: “jack lee”}
stype := reflect.TypeOf(s)
fmt.Println(stype)
svalue:= reflect.ValueOf(s)
for i:=0; i < svalue.NumField(); i++ {
key := stype.Field(i)
value := svalue.Field(i).Interface()
fmt.Printf(“第%d个字段是:%s:%v = %v \n”, i+1, key.Name, key.Type, value)
}
for i:=0; i < stype.NumMethod(); i++ {
m := stype.Method(i)
fmt.Printf(“第%d个方法是:%s:%v\n”, i+1, m.Name, m.Type)
}
}
结果
main.jack
第1个字段是:Id:int = 1
第2个字段是:Name:string = jack lee
第1个方法是:Hello:func(main.jack)
第2个方法是:Hi:func(main.jack)
判断类型
num := 1;
numType := reflect.TypeOf(num)
if k := numType.Kind(); k == reflect.Int {
fmt.Println(“bingo”)
}
修改内容
// 如果是整型的话 test := 333 testV := reflect.ValueOf(&test) testV.Elem().SetInt(666) fmt.Println(test) //666
修改struct
type judge struct {
Id int
Name string
}
S:=&judge{Id:1,Name:”coffee”}
V:=reflect.ValueOf(S)
if V.Kind()!=reflect.Ptr {
fmt.Println(“不是指针类型,没法进行修改操作”)
return
}
V = V.Elem() //指针指向的元素
name:=V.FieldByName(“Name”)
if name.Kind() == reflect.String {
name.SetString(“小学生”)
}
fmt.Printf(“%#v \n”, *S)
反射调用方法
type Student struct {
Id int
Name string
}
func (s Student) GodName(name string){
fmt.Println(“我的名字是:”, name)
}
func main() {
s := Student{Id: 1, Name: “不好色的jack”}
v := reflect.ValueOf(s)
// 获取方法控制权
mv := v.MethodByName(“GodName”)
// 拼凑参数
args := []reflect.Value{reflect.ValueOf(“我是三好男人”)}
// 调用函数
mv.Call(args)
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注