// 修改反射对象的值 i := 20 fmt.Println("before i =", i) e := reflect.Indirect(reflect.ValueOf(&i)) // e := reflect.ValueOf(&i).Elem() if e.CanSet() { e.SetInt(22) } fmt.Println("after i =", i)
// 反射字段操作 // elem := reflect.Indirect(reflect.ValueOf(&u)) elem := reflect.ValueOf(&u).Elem() for i := 0; i < t.NumField(); i++ { // 反射获取字段的元信息,例如:名称、Tag 等 ft := t.Field(i) fmt.Println("field name:", ft.Name) tag := ft.Tag fmt.Println("Tag:", tag) fmt.Println("Tag json:", tag.Get("json"))
// 反射修改字段的值 fv := elem.Field(i) if fv.CanSet() { if fv.Kind() == reflect.Int { fmt.Println("change age to 30") fv.SetInt(30) } if fv.Kind() == reflect.String { fmt.Println("change name to jerry") fv.SetString("jerry") } } fmt.Println() } fmt.Println("after user:", u)
四、反射对象的方法
可以通过 Value 的 Method() 方法或 Type 的 Method() 方法,两种形式获取对象方法信息进行反射调用,略有不同,示例如下: