📅  最后修改于: 2023-12-03 14:41:34.344000             🧑  作者: Mango
在 Golang 中,reflect 包提供了可以在运行时动态操作对象的功能。在操作对象时,我们经常需要获取对象的实际值,这时就要用到 reflect.Indirect() 函数。
reflect.Indirect() 函数的作用是返回传入参数的指针指向的值。如果传入的是非指针类型,则会返回原值本身。
函数定义如下:
func Indirect(v Value) Value
其中,参数 v 必须是一个指针类型的 reflect.Value。
下面的示例中,定义了一个结构体 Person 和一个方法 SetAge,通过使用 reflect 包进行动态调用方法并设置属性值。
type Person struct {
Name string
Age int
}
func (p *Person) SetAge(age int) {
p.Age = age
}
func main() {
p := &Person{Name: "Tom", Age: 18}
// 通过反射获取方法并调用
setValue := reflect.ValueOf(p)
method := setValue.MethodByName("SetAge")
// 通过反射获取方法的参数类型并创建参数
argType := method.Type().In(0)
argValue := reflect.New(argType).Elem()
argValue.SetInt(19)
// 调用方法并设置属性值
method.Call([]reflect.Value{argValue})
fmt.Println(p.Age)
// 通过 Indirect 函数获取值并设置属性值
indirectValue := reflect.Indirect(setValue)
indirectValue.FieldByName("Age").SetInt(20)
fmt.Println(p.Age)
}
通过调用 setAge 方法,我们可以将 p 的 Age 设置为 19,再通过 Indirect 函数获取 p 的实际值并设置 Age 为 20。
输出结果为:
19
20
reflect.Indirect() 函数是 Golang 中非常实用的函数之一,可以帮助我们在运行时动态操作对象,需要注意的是参数必须为指针类型的 reflect.Value。