code: func (j *JSONPath) walk(value []reflect.Value, node Node) ([]reflect.Value, error) {
  	switch node := node.(type) {
  	case *ListNode:
  		return j.evalList(value, node)
  	case *TextNode:
  		return []reflect.Value{reflect.ValueOf(node.Text)}, nil
  	case *FieldNode:
  		return j.evalField(value, node)
  	case *ArrayNode:
  		return j.evalArray(value, node)
  	case *FilterNode:
  		return j.evalFilter(value, node)
  	case *IntNode:
  		return j.evalInt(value, node)
  	case *BoolNode:
  		return j.evalBool(value, node)
  	case *FloatNode:
  		return j.evalFloat(value, node)
  	case *WildcardNode:
  		return j.evalWildcard(value, node)
  	case *RecursiveNode:
  		return j.evalRecursive(value, node)
  	case *UnionNode:
  		return j.evalUnion(value, node)
  	case *IdentifierNode:
  		return j.evalIdentifier(value, node)
  	default:
  		return value, fmt.Errorf("unexpected Node %v", node)
  	}
  }
docs: // walk visits tree rooted at the given node in DFS order