如何在 Golang Walk 中提前终止?

如果可能,让 Gofilepath.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

}


慕哥9229398
浏览 180回答 2
2回答

明月笑刀无情

你应该从你的 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}

倚天杖

您可以使用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}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go