golang的反射机制(二)
通过反射修改对象的值
1、反射的指针实例
package main
import (
"fmt"
"reflect"
)
func main() {
var num float64=1.23
//需要操作指针
//通过reflect.ValueOf(),获取num的Value对象
pointer:=reflect.ValueOf(&num)//注意参数必须是指针才能改其值
newValue:=pointer.Elem()
fmt.Println("Type:",newValue.Type()) //float64
fmt.Println("是否可以修改数据:",newValue.CanSet()) //true
//重新赋值
newValue.SetFloat(3.14)
fmt.Println(num) //3.14
//如果reflect.ValueOf()的参数不是指针
value:=reflect.ValueOf(num)
//value.SetFloat(6.66) //panic: reflect: reflect.Value.SetFloat using unaddressable value
fmt.Println(value.CanSet()) //false
}
2、反射的对象实例
package main
import (
"fmt"
"reflect"
)
type Student struct {
Name string
Age int
School string
}
func main() {
s1:=Student{"李四",20,"北大"}
//通过反射,更改对象的数值,前提是数据可以被更改
value:=reflect.ValueOf(&s1)
if value.Kind() == reflect.Ptr{
newValue:=value.Elem()
fmt.Println(newValue.CanSet()) //true
//通过获取字段对其值进行修改
f1:=newValue.FieldByName("School")
f1.SetString("清华")
fmt.Println(s1) //{李四 20 清华}
}
}