反射操作普通变量-修改变量值

未匹配的标注

修改变量值#

我们可以通过反射,直接对变量进行修改。主要借助 reflect.Value 提供的 SetXxx 方法来进行设置。

但,特别强调:** 必须通过对应的指针类型来操作,才能改变传入的变量的值。**

需借助 reflect.**Value.Elem () ** 方法实现。

· func (v Value) Elem() Value

· func (v Value) SetBool(x bool)

· func (v Value) SetInt(x int64)

· func (v Value) SetUint(x uint64)

· func (v Value) SetFloat(x float64)

· func (v Value) SetComplex(x complex128)

· func (v Value) SetBytes(x []byte)

· func (v Value) SetString(x string)

· func (v Value) SetPointer(x unsafe.Pointer)

· func (v Value) SetCap(n int)

· func (v Value) SetLen(n int)

· func (v Value) SetMapIndex(key, val Value)

· func (v Value) Set(x Value)

首先看这样一个演示案例:

func reflectTest(i interface{})  {
   // 得到 reflect.Value
   reVal := reflect.ValueOf(i)

   // 查看reVal的类别
   fmt.Println("kind=", reVal.Kind())

   // 修改变量值为 666
   reVal.SetInt(666)
}

func main() {
   // 定义普遍int 变量
   var num int = 100

   // 调用反射测试函数,实现修改num的值
   reflectTest(&num)
}

在 reflect.Value 中提供了一个 SetInt () 方法。显然可以修改 int 值 num。我们尝试借助该方法,将 num 的值修改为 666。但运行,会报错:

panic: reflect: reflect.Value.SetInt using unaddressable value

借助前面讲到的 Kind () 查看 reVal 的类别,为 ptr,说明是一个指针。而默认 Value 下的所有方法都不是针对指针设定的,而是(v Value)

因此,我们必须在 reVal.SetInt (666) 方法调用之前获取到 reVal 对应的值,才能正常调用 SetInt () 函数。使用 reflect.Value.Elem () 方法。

func (v Value) Elem() Value

Elem 返回 v 持有的接口保管的值的 Value 封装,或者 v 持有的指针指向的值的 Value 封装。

添加 reflect.Value.Elem () 方法的调用。

// 修改变量值为 666
reVal.Elem().SetInt(666)

打印输出:num = 666。成功修改。

可以按我们以往指针使用的方法来理解 Elem () 的作用,reflect.Value.Elem () 方法的调用类似于:

var num int = 100
var p *int = &num
*p = 666
num = *p
fmt.Println("num=", num)

在反射的实际应用中,Elem () 方法的出镜率非常高。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
wangchunbo
讨论数量: 0
发起讨论 只看当前版本


暂无话题~