📜  Golang 中的reflect.Indirect()函数示例(1)

📅  最后修改于: 2023-12-03 14:41:34.344000             🧑  作者: Mango

Golang 中的 reflect.Indirect() 函数

在 Golang 中,reflect 包提供了可以在运行时动态操作对象的功能。在操作对象时,我们经常需要获取对象的实际值,这时就要用到 reflect.Indirect() 函数。

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。