reflect
包
【贼拉慢,反射尽量别乱用】
日常写业务中,动态获取未知变量的type数据类型和value值
可在运行时检查和操作类型、变量和结构体 【动态地获取】
简单例子:
func main() {
var num float64 = 1.236
reflectNum(num)
}
func reflectNum(arg interface{}) {
fmt.Println("type: ", reflect.TypeOf(arg))
fmt.Println("value: ", reflect.ValueOf(arg))
}
输出:
type: float64
value: 1.236
reflect 有
`TypeOf` 数据类型
`ValueOf` 值
package main
import (
"fmt"
"reflect"
)
type User struct {
Id int
Name string
Age int
}
func (this User) Call() {
fmt.Println("User called")
fmt.Printf("%v\n", this)
}
func (this User) Mess() {
fmt.Println("User messed")
fmt.Printf("%v\n", this)
}
func main() {
user := User{1, "Alibaba", 18}
DoFileAndMethod(user)
}
func DoFileAndMethod(input interface{}) {
GetType := reflect.TypeOf(input)
GetValue := reflect.ValueOf(input)
for i := 0; i < GetType.NumField(); i++ {
field := GetType.Field(i)
value := GetValue.Field(i).Interface()
fmt.Printf("%s: %v = %v\n", field.Name, field.Type, value)
}
for i := 0; i < GetType.NumMethod(); i++ {
m := inputType.Method(i)
fmt.Printf("%s: %v\n", m.Name, m.Type)
}
}
1.
获取类型信息:
使用reflect.TypeOf()函数可以获取一个变量的类型信息。例如,我们可以获取苹果对象的类型:
apple := Apple{}
t := reflect.TypeOf(apple)
fmt.Println(t) // 输出:main.Apple
2.
创建实例:
使用reflect.New()函数可以创建一个指定类型的新实例。例如,我们可以创建一个新的苹果对象:
t := reflect.TypeOf(Apple{})
apple := reflect.New(t).Elem().Interface().(Apple)
fmt.Println(apple) // 输出:{Apple}
3.
调用方法:
使用reflect.ValueOf()函数可以获取一个变量的值信息,并使用reflect.MethodByName()函数根据方法名获取方法的反射值。然后,可以通过Call()方法调用该方法。例如,我们可以调用苹果对象的Eat()方法:
apple := Apple{}
v := reflect.ValueOf(apple)
method := v.MethodByName("Eat")
method.Call(nil) // 调用Eat方法
4.
修改字段值:
使用reflect.ValueOf()函数可以获取一个变量的值信息,并使用FieldByName()函数根据字段名获取字段的反射值。然后,可以通过Set()方法修改该字段的值。例如,我们可以修改苹果对象的Color字段值:
apple := Apple{Color: "Red"}
v := reflect.ValueOf(&apple).Elem()
field := v.FieldByName("Color")
field.SetString("Green") // 修改Color字段值
fmt.Println(apple.Color) // 输出:Green
这些只是反射的一些基本用法示例