2016-04-19 117 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會跳過包含目錄中的其餘文件 –