go chapter 9 - 反射
Posted webglcn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了go chapter 9 - 反射相关的知识,希望对你有一定的参考价值。
https://www.jianshu.com/p/53adb1e92710
// 根据反射,获取对象的字段名,类型,值
func StructInfo(o interface{}){ t := reflect.TypeOf(o) //获取类型 if k := t.Kind(); k != reflect.Struct{ fmt.Println("the object is not a struct, but it is", t.Kind()) return } v := reflect.ValueOf(o) // 获取值 for i := 0; i < t.NumField(); i++{ // 获取字段 f := t.Field(i) // 获取当前的字段(名字,类型) val := v.Field(i).Interface() // 获取值 fmt.Printf("%6s:%v = %v ", f.Name, f.Type, val) } }
// 根据反射,设置变量,调用方法
/* 通过反射设置字段 */ func ReflectSet(o interface{}){ v := reflect.ValueOf(o) if v.Kind() == reflect.Ptr && !v.Elem().CanSet(){ fmt.Println("修改失败") return } v = v.Elem() //获取字段 f := v.FieldByName("Name") if !f.IsValid(){ fmt.Println("修改失败") return } //设置值 if f.Kind() == reflect.String{ f.SetString("chairis") } } /* 通过反射调用函数 */ func ReflectMethod(o interface{}){ v := reflect.ValueOf(o) //无参函数调用 m1:= v.MethodByName("Say") m1.Call([]reflect.Value{}) //有参函数调用 m2 := v.MethodByName("Hello") m2.Call([]reflect.Value{reflect.ValueOf("iris")}) }
stu := Student{Address:Address{City:"Shanghai", Area:"Pudong"}, Name:"chain", Age:23} fmt.Println("before: ", stu) ReflectSet(&stu) fmt.Println("after: ", stu)
以上是关于go chapter 9 - 反射的主要内容,如果未能解决你的问题,请参考以下文章
《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading
《Real-Time Rendering》第四版学习笔记——Chapter 9 Physically Based Shading