在 Golang 中,通过 反射 我们可以修改 变量 的值。在修改变量的值之前,最好使用 CanSet 方法获取是否可以修改该变量的值。
通过反射修改变量的值,有两种方法,一种是使用 Set 方法,一种是使用 SetXXX() 方法,比如 SetString()、SetInt() 等。
reflect.ValueOf(&x).Elem().Set()
使用 reflect.ValueOf
传入我们要获取的变量的地址,并且使用 Elem 获取指针信息,接着,调用 Set 方法修改变量的值。
其中,Set 方法接受的 参数 是一个 reflect.ValueOf 函数 的 返回值。
reflect.ValueOf(&x).Elem().SetXXX()
使用 reflect.ValueOf
传入我们要获取的变量的地址,并且使用 Elem 获取指针信息,接着,调用 SetXXX 方法修改变量的值。
通过反射的 SetXXX 方法修改变量的值
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
var x = 1024
var str = "HaiCoder"
xValue := reflect.ValueOf(&x).Elem()
strValue := reflect.ValueOf(&str).Elem()
if xValue.CanSet(){
xValue.SetInt(10240)
fmt.Println("New xValue =", xValue)
}
if strValue.CanSet(){
strValue.SetString("haicoder")
fmt.Println("New strValue =", strValue)
}
}
程序运行后,控制台输出如下:
首先,我们定义了一个 int 类型 的变量 x 和一个 字符串 类型的变量 str,接着,我们使用 reflect.ValueOf
获取这三个变量的值信息,同时,使用 Elem 获取指针所指向的对象。
最后,我们使用 CanSet 方法判断,指针指向的对象是否可以被修改,如果可以被修改,那么再使用 SetXX 方法修改变量的值。
我们要修改变量的值,那么必须在 reflect.ValueOf
传入变量的地址,而不能传入变量的值。
通过反射的 Set 方法修改变量的值
package main
import (
"fmt"
"reflect"
)
func main() {
fmt.Println("嗨客网(www.haicoder.net)")
var x = 1024
var str = "HaiCoder"
xValue := reflect.ValueOf(&x).Elem()
strValue := reflect.ValueOf(&str).Elem()
newXValue := reflect.ValueOf(20140)
newStrValue := reflect.ValueOf("haicoder")
if xValue.CanSet(){
xValue.Set(newXValue)
fmt.Println("New xValue =", xValue)
}
if strValue.CanSet(){
strValue.Set(newStrValue)
fmt.Println("New strValue =", strValue)
}
}
程序运行后,控制台输出如下:
我们通过 reflect.ValueOf
分别获取两个新的变量的值,接着,使用 Set 方法,即可通过反射设置变量的新的值。
通过反射修改变量的值,有两种方法,一种是使用 Set 方法,一种是使用 SetXXX() 方法,比如 SetString()、SetInt() 等。Go 语言反射修改变量语法:
reflect.ValueOf(&x).Elem().Set()
Go 语言反射修改变量语法:
reflect.ValueOf(&x).Elem().SetXXX()