I want to build the program that sets field of struct using reflection. I made it work for top-level field but I am struggling with nested struct field. How can iterate over nested struct field?
type Payload struct {
Type string `json:"type"`
SubItem *SubItem `json:"sub_item"`
}
type SubItem struct {
Foo string `json:"foo"`
}
func main() {
var payload Payload
setValue(&payload, "type", "test1")
setValue(&payload, "sub_item.foo", "test2")
}
func setValue(structPtr interface{}, key string, value string) {
structValue := reflect.Indirect(reflect.ValueOf(structPtr))
for i, subkey := range strings.Split(key, ".") {
isLast := i == len(strings.Split(key, "."))-1
var found bool
// this line is crashing with "reflect: call of reflect.Value.NumField on zero Value"
for i := 0; i < structValue.NumField(); i++ {
field := structValue.Type().Field(i)
jsonTags := strings.Split(field.Tag.Get("json"), ",")
if jsonTags[0] == subkey {
found = true
if isLast {
if isLast {
// last element
// TODO set value
fmt.Printf("TODO set value %s to %v", value, structValue)
structValue = reflect.Indirect(reflect.ValueOf(structPtr))
}
} else {
structValue = reflect.Indirect(reflect.ValueOf(structValue.Field(i).Interface()))
}
break
}
}
if !found {
panic(fmt.Errorf("failed to find field %s", key))
}
}
}
Aucun commentaire:
Enregistrer un commentaire