Home >Backend Development >Golang >Pass variable reference to WalkDirFunc

Pass variable reference to WalkDirFunc

WBOY
WBOYforward
2024-02-09 08:39:321154browse

将变量引用传递给 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.

Question content

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)

}

Solution

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete