code: func (sc *Client) Walk(root string) <-chan fswalker.WalkItem {
  	iterChannel := make(chan fswalker.WalkItem)
  	dirsToProcess := []string{root}
  	go func() {
  		for len(dirsToProcess) > 0 {
  			dirs, files := []os.FileInfo{}, []os.FileInfo{}
  			dirpath := dirsToProcess[len(dirsToProcess)-1]
  			dirsToProcess = dirsToProcess[:len(dirsToProcess)-1]
  			filesInfo, err := sc.ReadDir(sc.ResolveSymlink(dirpath))
  			if err != nil {
  				fmt.Printf("Error reading directory (%s): %s\n", err.Error(), dirpath)
  			} else {
  				for _, fileInfo := range filesInfo {
  					switch {
  					case fileInfo.Mode().IsDir():
  						dirs = append(dirs, fileInfo)
  						dirsToProcess = append(dirsToProcess, filepath.Join(dirpath, fileInfo.Name()))
  					case fileInfo.Mode().IsRegular():
  						files = append(files, fileInfo)
  					case fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink:
  						sympath := filepath.Join(dirpath, fileInfo.Name())
  						pointerFI, err := sc.Stat(sympath)
  						if err != nil {
  							fmt.Fprintf(os.Stderr, "Error reading symlink (%s): %s\n", err.Error(), sympath)
  						} else {
  							switch {
  							case pointerFI.Mode().IsDir():
  								dirs = append(dirs, fileInfo)
  								dirsToProcess = append(dirsToProcess, sc.Join(dirpath, fileInfo.Name()))
  							case pointerFI.Mode().IsRegular():
  								files = append(files, fileInfo)
  							}
  						}
  					}
  				}
  			}
  			iterChannel <- fswalker.WalkItem{Dirpath: dirpath,
  				Dirs:  dirs,
  				Files: files,
  				Err:   err}
  		}
  		close(iterChannel)
  	}()
  	return iterChannel
  }
docs: // Walk walks recursively through the SFTP
  // @root: root path to start walking through