Golang——通过反射修改值

Golang中可以通过反射修改变量的值,直接上代码:

package main

import (
	"fmt"
	"reflect"
	_ "strconv"
)

func main() {
	var x float64 = 6.6

	p := reflect.ValueOf(&x)
	fmt.Println(p.Kind())
	j := p.Elem()
	fmt.Println("Val:", j)
	j.SetFloat(9.9)
	fmt.Println("Val:", j)

}
复制代码

输出:

ptr
Val: 6.6
Val: 9.9
复制代码

需要注意的是,reflect.ValueOf(&x)传递的参数是指针类型。如果传递非指针会发生什么呢?

package main

import (
	"fmt"
	"reflect"
	_ "strconv"
)

type Element interface{}

type List []Element

type Person struct {
	name string
	age  int
}

func (p Person) String() string {
	return fmt.Sprintf("name: %s, age: %d", p.name, p.age)
}

func main() {
	var x float64 = 6.6

	p := reflect.ValueOf(x)
	fmt.Println(p.Kind())
	j := p.Elem()
	fmt.Println("Val:", j)
	j.SetFloat(9.9)
	fmt.Println("Val:", j)

}
复制代码

输出:

float64
panic: reflect: call of reflect.Value.Elem on float64 Value

goroutine 1 [running]:
reflect.Value.Elem(0x10ada00, 0xc000014070, 0x8e, 0x1, 0x1, 0x8)
        /usr/local/Cellar/go/1.16.6/libexec/src/reflect/value.go:843 +0x1a5
main.main()
        /xxx/main.go:49 +0x14d
exit status 2
复制代码

直接抛出了异常。ValueOf参数为interface{}类型,返回Value类型的值。在p.Elem()中,会判断p.kind(),既不是Interface也不是Ptr时,会panic抛异常,也就是传递给ValueOf的类型为interface或者ptr类型才允许调用Elem。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享