reflect.New
не является прямым аналогом new
, так как он не может возвращать указанный тип c, он может возвращать только reflect.Value
. Это означает, что вы пытаетесь разархивировать в *reflect.Value
, что, очевидно, не сработает (даже если бы это произошло, ваш код был бы передан в **Type
, что тоже не то, что вам нужно).
Используйте parsedInput.Interface()
, чтобы получить базовое значение после создания нового значения, в которое нужно разобрать. Тогда вам не нужно отражать одно и то же значение во второй раз, поскольку это будет reflect.Value
из reflect.Value
, что опять-таки не даст ничего полезного.
Наконец, вы перед возвратом необходимо использовать parsedInput.Interface()
, иначе вы возвращаете reflect.Value
, а не значение типа ввода.
Например:
func genericParser(incomingData io.Reader, inputStructure interface{}) (interface{}, error) {
parsedInput := reflect.New(reflect.TypeOf(inputStructure).Elem())
decoder := json.NewDecoder(incomingData)
err := decoder.Decode(parsedInput.Interface())
if err != nil {
return nil, err
}
for i := 0; i < parsedInput.Elem().NumField(); i++ {
fmt.Printf("Field name was: %s\n", parsedInput.Type().Elem().Field(i).Name)
}
return parsedInput.Interface(), nil
}
https://play.golang.org/p/CzDrj6sgQNt