如何在Golang Walk中提前终止?

Eng*_*_DJ 6 go

如果可能的话,让Go filepath.Walk早日返回的惯用方式是什么?

我正在写一个函数来查找给定名称的嵌套目录。使用“ filepath.Walk我”找不到第一个匹配项时立即终止步行的方法。

func (*RecursiveFinder) Find(needle string, haystack string) (result string, err error) {
    filepath.Walk(haystack, func(path string, fi os.FileInfo, errIn error) (errOut error) {
        fmt.Println(path)

        if fi.Name() == needle {
            fmt.Println("Found " + path)
            result = path
            return nil
        }

        return
    })

    return
}
Run Code Online (Sandbox Code Playgroud)

Not*_*fer 9

您应该从walkfunc返回错误。要确保没有返回实际错误,您可以使用已知错误io.EOF

func Find(needle string, haystack string) (result string, err error) {

    err = filepath.Walk(haystack, 
      filepath.WalkFunc(func(path string, fi os.FileInfo, errIn error) error {
        fmt.Println(path)

        if fi.Name() == needle {
            fmt.Println("Found " + path)
            result = path
            return io.EOF
        }

        return nil
    }))

    if err == io.EOF {
        err = nil
    }

    return
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢回答。我在发布后发现了 `filepath.SkipDir()`,文档中提到了这一点。你知道返回 `io.EOF` 和 `SkipDir()` 有什么区别吗? (2认同)
  • SkipDir() 不会停止遍历,而是会跳转到下一个目录。如果不是递归遍历,效果是一样的,但我认为最好返回另一个错误。来自 TFM:`如果返回错误,则处理停止。唯一的例外是当函数返回特殊值 SkipDir 时。如果函数在目录上调用时返回 SkipDir,Walk 将完全跳过目录的内容。如果函数在非目录文件上调用时返回 SkipDir,Walk 将跳过包含目录中的剩余文件` (2认同)