code: func (bj BinaryJSON) Walk(walkFn BinaryJSONWalkFunc, pathExprList ...PathExpression) (err error) {
  	pathSet := make(map[string]bool)
  
  	var doWalk extractCallbackFn
  	doWalk = func(fullpath PathExpression, bj BinaryJSON) (stop bool, err error) {
  		pathStr := fullpath.String()
  		if _, ok := pathSet[pathStr]; ok {
  			return false, nil
  		}
  
  		stop, err = walkFn(fullpath, bj)
  		pathSet[pathStr] = true
  		if stop || err != nil {
  			return
  		}
  
  		if bj.TypeCode == TypeCodeArray {
  			elemCount := bj.GetElemCount()
  			for i := 0; i < elemCount; i++ {
  				path := fullpath.pushBackOneIndexLeg(i)
  				stop, err = doWalk(path, bj.arrayGetElem(i))
  				if stop || err != nil {
  					return
  				}
  			}
  		} else if bj.TypeCode == TypeCodeObject {
  			elemCount := bj.GetElemCount()
  			for i := 0; i < elemCount; i++ {
  				path := fullpath.pushBackOneKeyLeg(string(bj.objectGetKey(i)))
  				stop, err = doWalk(path, bj.objectGetVal(i))
  				if stop || err != nil {
  					return
  				}
  			}
  		}
  		return false, nil
  	}
  
  	fullpath := PathExpression{legs: make([]pathLeg, 0, 32), flags: pathExpressionFlag(0)}
  	if len(pathExprList) > 0 {
  		for _, pathExpr := range pathExprList {
  			var stop bool
  			stop, err = bj.extractToCallback(pathExpr, doWalk, fullpath)
  			if stop || err != nil {
  				return err
  			}
  		}
  	} else {
  		_, err = doWalk(fullpath, bj)
  		if err != nil {
  			return
  		}
  	}
  	return nil
  }
docs: // Walk traverse BinaryJSON objects