var x float64=3.4v := reflect.ValueOf(x) // x 值传入,ValueOf接收到的x已经不是原来的xv.SetFloat(7.1) // 这句话及时执行成功,也无法修改变量x的值
值类型取地址传入
var x float64=3.4p := reflect.ValueOf(&x) // 注意:获取 x 的地址fmt.Println("type of p:", p.Type())fmt.Println("settability of p:", p.CanSet()) // CanSet用来判断是否是可取地址的, 此处返回false// 此处仍然是不可取地址的,因为p内部存储的是变量的地址,需要通过类似 *x 的方式真正访问变量空间
使用Elem()方法访问变量内存
v := p.Elem()fmt.Println("settability of v:", v.CanSet()) // truev.SetFloat(7.1)fmt.Println(v.Interface()) // 7.1fmt.Println(x) // 7.1
结构体值访问
typeTstruct { A int B string}t :=T{23, "skidoo"}s := reflect.ValueOf(&t).Elem()typeOfT := s.Type()for i :=0; i < s.NumField(); i++ { f := s.Field(i) fmt.Printf("%d: %s%s = %v\n", i, typeOfT.Field(i).Name, f.Type(), f.Interface())}
结构体字段值修改
s.Field(0).SetInt(77)s.Field(1).SetString("Sunset Strip")fmt.Println("t is now", t)
反射操作方法与函数
// 获取add函数TypevType:=reflect.TypeOf(add)// 返回func类型的参数个数,如果不是函数,将会panic numIn:=vType.NumIn()addIn:=make([]reflect.Type,numIn) for i:=0;i<numIn;i++{ addIn[i]=vType.In(i)