2016-04-19 151 views
1

如果可能的话,Go的filepath.Walk提前回归的习惯是什么?如何在Golang 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

为什么不返回错误并让步行停止?你可以返回'io.EOF'来确保没有其他错误。 –

+0

扩展为答案... –

回答

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 
} 
+0

感谢您的回答。发布后我发现了'filepath.SkipDir()',文档中提到了这一点。你知道返回'io.EOF'和'SkipDir()'是否有区别吗? –

+0

SkipDir()不会停止步行,但会跳到下一个目录。如果它不是一个递归散步效果将是相同的,但我认为最好是返回另一个错误。来自TFM:'如果返回错误,处理停止。唯一的例外是函数返回特殊值SkipDir。如果函数在目录上调用时返回SkipDir,则Walk完全跳过目录的内容。如果函数在非目录文件上调用时返回SkipDir,则Walk会跳过包含目录中的其余文件 –