返回

用 Go REFLECT Library 动态修改变量值

前端

本文是学习Go Reflect Library的第五篇文章,主要内容是使用 reflect.Value 动态修改变量值。在之前的文章中,我们已经介绍了如何使用 reflect.Value 的各种方法来获取变量为基本数据类型、Map 和结构体形式时的 value 值或者 Key 对,本文将在此基础上继续介绍如何使用 reflect.Value 动态修改变量值。

在学习动态修改变量值之前,我们需要知道 Go 语言变量的存储结构。Go 语言的变量可以分为两类:基本数据类型变量和引用数据类型变量。基本数据类型变量直接存储在内存中,而引用数据类型变量存储的是对内存中数据的引用。

对于基本数据类型变量,我们可以使用 reflect.Value.SetInt()、reflect.Value.SetFloat()、reflect.Value.SetBool() 等方法直接修改变量值。例如,以下代码修改了变量 i 的值:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    i := 10
    v := reflect.ValueOf(&i)
    v.Elem().SetInt(20)
    fmt.Println(i) // 输出: 20
}

对于引用数据类型变量,我们需要先使用 reflect.Value.Elem() 方法获取变量引用的实际值,然后才能修改实际值。例如,以下代码修改了变量 s 的值:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    s := "hello"
    v := reflect.ValueOf(&s)
    v.Elem().SetString("world")
    fmt.Println(s) // 输出: world
}

除了基本数据类型和引用数据类型变量之外,我们还可以使用 reflect.Value 动态修改 Map 和结构体形式的变量值。例如,以下代码修改了变量 m 的值:

package main

import (
    "fmt"
    "reflect"
)

func main() {
    m := map[string]int{"a": 1, "b": 2}
    v := reflect.ValueOf(&m)
    v.Elem().SetMapIndex(reflect.ValueOf("c"), reflect.ValueOf(3))
    fmt.Println(m) // 输出: map[a:1 b:2 c:3]
}

以上代码中,我们使用 reflect.Value.SetMapIndex() 方法为 Map 变量 m 添加了一个新的键值对。

类似的,以下代码修改了变量 p 的值:

package main

import (
    "fmt"
    "reflect"
)

type Person struct {
    Name string
    Age  int
}

func main() {
    p := Person{"Alice", 20}
    v := reflect.ValueOf(&p)
    v.Elem().Field(0).SetString("Bob")
    v.Elem().Field(1).SetInt(30)
    fmt.Println(p) // 输出: {Bob 30}
}

以上代码中,我们使用 reflect.Value.Elem().Field() 方法获取了结构体变量 p 的第一个字段和第二个字段,然后使用 SetString() 和 SetInt() 方法修改了字段的值。

以上就是如何使用 Go REFLECT Library 动态修改变量值的方法。