code: func (j *JSONPath) evalRecursive(input []reflect.Value, node *RecursiveNode) ([]reflect.Value, error) {
  	result := []reflect.Value{}
  	for _, value := range input {
  		results := []reflect.Value{}
  		value, isNil := template.Indirect(value)
  		if isNil {
  			continue
  		}
  
  		kind := value.Kind()
  		if kind == reflect.Struct {
  			for i := 0; i < value.NumField(); i++ {
  				results = append(results, value.Field(i))
  			}
  		} else if kind == reflect.Map {
  			for _, key := range value.MapKeys() {
  				results = append(results, value.MapIndex(key))
  			}
  		} else if kind == reflect.Array || kind == reflect.Slice || kind == reflect.String {
  			for i := 0; i < value.Len(); i++ {
  				results = append(results, value.Index(i))
  			}
  		}
  		if len(results) != 0 {
  			result = append(result, value)
  			output, err := j.evalRecursive(results, node)
  			if err != nil {
  				return result, err
  			}
  			result = append(result, output...)
  		}
  	}
  	return result, nil
  }
docs: // evalRecursive visits the given value recursively and pushes all of them to result