目录
- 概述
- 实践
- 基本应用
- 复杂应用
- 结束
概述
Golang中的反射用法还是比较简单的
- reflect.TypeOf(arg)
- reflect.ValueOf(arg)
实践
基本应用
package main
import (
"fmt"
"reflect"
)
func reflectNum(arg interface{}) {
fmt.Println("type = ", reflect.TypeOf(arg))
fmt.Println("value = ", reflect.ValueOf(arg))
}
func main() {
var num float64 = 1.2345
reflectNum(num)
}
结果如下:
复杂应用
package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age 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 的 type
argType := reflect.TypeOf(arg)
fmt.Println("argType is:", argType.Name())
// 获取 arg 的 value
argValue := 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中的反射机制及应用 至此结束,如有疑问,欢迎评论区留言。