目录
- 概述
- 实践
- 基本应用
- 复杂应用
- 结束
概述
Golang中的反射用法还是比较简单的
- reflect.TypeOf(arg)
- reflect.ValueOf(arg)
实践
基本应用
package mainimport ("fmt""reflect"
)func reflectNum(arg interface{}) {fmt.Println("type = ", reflect.TypeOf(arg))fmt.Println("value = ", reflect.ValueOf(arg))
}func main() {var num float64 = 1.2345reflectNum(num)}
结果如下:
复杂应用
package mainimport ("fmt""reflect"
)type User struct {Id intName stringAge int
}func (this *User) Call() {fmt.Println("user is called...")fmt.Printf("详细:v%\n", this)
}func (this User) Call2() {fmt.Println("user is called...")fmt.Printf("详细:v%\n", this)
}func DoFieldAndMethod(arg interface{}) {// 获取 arg 的 typeargType := reflect.TypeOf(arg)fmt.Println("argType is:", argType.Name())// 获取 arg 的 valueargValue := reflect.ValueOf(arg)fmt.Println("argValue is:", argValue)// 通过 type 获取字段for i := 0; i < argType.NumField(); i++ {field := argType.Field(i)value := argValue.Field(i).Interface()fmt.Printf("%s:%v %v \n", field.Name, field.Type, value)}fmt.Println("分隔 ...")// 通过 type 获取方法调用for i := 0; i < argType.NumMethod(); i++ {m := argType.Method(i)fmt.Printf("%s: %s% \n", m.Name, m.Type)}fmt.Println("分隔 ...反射调用方法")for i := 0; i < argValue.NumMethod(); i++ {argValue.Method(i).Call(nil)}
}func main() {user := User{1, "张三", 19}DoFieldAndMethod(user)
}
结果如下:
结束
Golang中的反射机制及应用 至此结束,如有疑问,欢迎评论区留言。