package main
import("context""fmt""reflect")type A struct{
ctx context.Context
A int
B float64
c string}funcmain(){var aa =&A{}// pointer
typ := reflect.TypeOf(aa)// *main.A
val := reflect.ValueOf(aa)// &{<nil> 0 }
kd := val.Kind()// ptr or struct
fmt.Println(typ)
fmt.Println(val)
fmt.Println(kd)// Elem returns the value that the interface v contains or that the pointer v points to// means: ptr --> structif kd == reflect.Pointer {
val = val.Elem()
typ = typ.Elem()}
num := val.NumField()for i :=0; i < num; i++{
fmt.Printf("Field %s: value:%v, CanSet:%v jsontag:%s\n", typ.Field(i).Name, val.Field(i), val.Field(i).CanSet(), typ.Field(i).Tag.Get("json"))if typ.Field(i).Type.Kind()== reflect.Int {if val.Field(i).CanSet(){
val.Field(i).SetInt(111)}}}
fmt.Println(aa)}
输出结果
*main.A
&{<nil>00}
ptr
Field ctx: value:<nil>,CanSet:false jsontag:
Field A: value:0,CanSet:true jsontag:
Field B: value:0,CanSet:true jsontag:
Field c: value:,CanSet:false jsontag:
&{<nil>1110}