如何在Golang Walk早期终止?

时间:2016-04-19 08:48:45

标签: 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
}

2 个答案:

答案 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
}