为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Golang Walk 中提前终止?

如何在 Golang Walk 中提前终止?

Go
慕哥9229398 2022-01-04 20:50:54
如果可能,让 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}
查看完整描述

2 回答

?
明月笑刀无情

TA贡献1828条经验 获得超4个赞

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

}


查看完整回答
反对 回复 2022-01-04
?
倚天杖

TA贡献1828条经验 获得超3个赞

您可以使用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

}


查看完整回答
反对 回复 2022-01-04
  • 2 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信