Go语言 将变量引用传递给WalkDirFunc

w7t8yxp5  于 2022-12-16  发布在  Go
关注(0)|答案(1)|浏览(128)

我正在递归地遍历一个给定的目录,并将找到的文件名和大小存储在map[string]uint32中。我发现了一篇使用path/filepath/WalkDir函数和WalkDirFunc描述how to recursively walk a specified directory的帖子。
我对Go语言比较陌生,还没有找到一种方法来将Map的引用传递给WalkDirFunc,因为它的签名只指定了三个参数:

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
}

编辑:因为walkWalkDirFunc传递给filepath.walkDir的Map,所以需要从这里开始传递Map,在Python中,我会使用命名参数来完成这个任务,但是在Go语言中,最好的方法是什么呢?

func main() {
    args := os.Args
    ...

    fullPath := args[1]
    dirMap := make(map[string]uint32)

    // dirMap should be passed here
    filepath.WalkDir(fullPath, walk)

}

bvjxkvbb

bvjxkvbb1#

使用closure。将漫游更改为:

func walk(dirMap map[string]uint32, path string, entry fs.DirEntry, err error) error {
    ...
}

像这样调用WalkDir:

dirMap := make(map[string]uint32)
filepath.WalkDir(fullPath, func(path string, entry fs.DirEntry, err error) error {
    return walk(dirMap, path, entry, err)
})

在此处运行示例:https://go.dev/play/p/rjV2rSBsUDz

相关问题