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