如果可能的话,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
}
答案 0 :(得分:5)
您应该从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
}
答案 1 :(得分:0)
您可以使用 errors.New 来定义您自己的错误:
import (
"errors"
"os"
"path/filepath"
)
var stopWalk = errors.New("stop walking")
func find(name, root string) (string, error) {
var spath string
e := filepath.Walk(root, func (path string, info os.FileInfo, e error) error {
if info.Name() == name {
spath = path
return stopWalk
}
return e
})
if e == stopWalk {
return spath, nil
}
return "", e
}
或者您可以使用filepath.Glob:
import "path/filepath"
func find(pattern string) (string, error) {
paths, e := filepath.Glob(pattern)
if paths == nil { return "", e }
return paths[0], nil
}