登录
首页 >  Golang >  Go问答

将变量传递给 WalkDirFunc 通过引用

来源:stackoverflow

时间:2024-02-08 11:00:30 146浏览 收藏

一分耕耘,一分收获!既然打开了这篇文章《将变量传递给 WalkDirFunc 通过引用》,就坚持看下去吧!文中内容包含等等知识点...希望你能在阅读本文后,能真真实实学到知识或者帮你解决心中的疑惑,也欢迎大佬或者新人朋友们多留言评论,多给建议!谢谢!

问题内容

我正在努力递归地迭代给定目录并将找到的文件的名称及其大小存储在 map[string]uint32 中。我发现一篇文章描述了如何使用 path/filepath/walkdir 函数和 walkdirfunc 递归地遍历指定目录。

我对 go 比较陌生,并且无法找到一种方法将对我的地图的引用传递给 walkdirfunc,因为它的签名仅指定三个参数:

func main() {
    args := os.args
    if len(args) != 2 {
        msg := fmt.sprintf("usage: %v ", 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
}

编辑:由于walk是传递给filepath.walkdirwalkdirfunc,因此有必要传递从这里开始的地图。在 python 中,我会使用命名参数来完成此任务,但 go 中最好的方法是什么?

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

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


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

}

正确答案


使用闭包。更改步行至:

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

今天关于《将变量传递给 WalkDirFunc 通过引用》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>