Home > Article > Backend Development > Pass variable reference to WalkDirFunc
php editor Youzi introduces to you an important concept about variable reference passing - passing the variable reference to WalkDirFunc. In PHP, variable reference passing is a transfer method that allows us to pass a reference to a variable to a function or method, thereby modifying the variable within the function. In this way, we can avoid creating new copies of variables inside the function and improve the execution efficiency of the code. WalkDirFunc is a sample function that can traverse all files in a specified directory and operate on them. Passing a variable reference to WalkDirFunc allows us to operate directly on the passed variable inside the function without returning the modified result. This approach is particularly useful when processing large amounts of data, reducing memory overhead and improving code readability and maintainability.
I am trying to recursively iterate a given directory and store the names of the found files and their sizes in a map[string]uint32
. I found an article describing how to use the path/filepath/walkdir function and walkdirfunc to recursively walk a specified directory.
I'm relatively new to go and can't find a way to pass a reference to my map to walkdirfunc
since its signature only specifies three arguments:
func main() { args := os.args if len(args) != 2 { msg := fmt.sprintf("usage: %v <path_to_directory>", args[0]) log.fatal(msg) } fullpath := args[1] dirmap := make(map[string]uint32) filepath.walkdir(fullpath, walk) } // how to create parameter accepting &map[string]uint32 func walk(path string, entry fs.direntry, err error) error { if err != nil { return err } if !entry.isdir() { // add entry and it's size to dirmap file, err := os.stat(path) if err != nil { log.println("error determining file size:", err) } size := file.size() // add path and size to dirmap } else if entry.isdir() { // recurse here } else { log.println("unhandled branch:") log.println(entry.info()) } return nil }
EDIT: Since walk
is the walkdirfunc
passed to filepath.walkdir
, it is necessary to pass the map starting here. In python I would use named parameters to accomplish this, but what is the best way in go?
func main() { args := os.Args ... fullPath := args[1] dirMap := make(map[string]uint32) // dirMap should be passed here filepath.WalkDir(fullPath, walk) }
Use closure. Change walk to:
func walk(dirmap map[string]uint32, path string, entry fs.direntry, err error) error { ... }
Call walkdir like this:
dirMap := make(map[string]uint32) filepath.WalkDir(fullPath, func(path string, entry fs.DirEntry, err error) error { return walk(dirMap, path, entry, err) })
Run the example here: https://www.php.cn/link/178fde6398864e33aaefae5d2d855f20
The above is the detailed content of Pass variable reference to WalkDirFunc. For more information, please follow other related articles on the PHP Chinese website!