我有這個簡單的腳本來嘗試遍歷文件系統(tǒng)并逐行讀取文件以匹配正則表達式上的行:package mainimport ( "bufio" "fmt" "io/ioutil" "log" "os" "regexp" "sync")type FileWithLine struct{ Line int Path string}var set = map[string]FileWithLine{}var rgx = regexp.MustCompile("ErrId\\s*:\\s*\"[[:alnum:]]+\"");func traverseDir(d string, wg *sync.WaitGroup){ fmt.Println("traversing dir:", d) if d == ".git"{ return } wg.Add(1) go func(wg *sync.WaitGroup){ defer wg.Done() files, err := ioutil.ReadDir(d) if err != nil { log.Fatal(err) } for _, f := range files { fmt.Println("we see file:", f.Name()) if f.IsDir() { traverseDir(f.Name(), wg) return } file, err := os.Open(f.Name()) if err != nil { log.Fatalf("failed opening file: %s", err) } scanner := bufio.NewScanner(file) scanner.Split(bufio.ScanLines) for scanner.Scan() { var line = scanner.Text() if rgx.MatchString(line) { fmt.Println("line matches:", line); } } file.Close() } }(wg)}func main() { var wg sync.WaitGroup traverseDir(".", &wg) fmt.Println("Main: Waiting for workers to finish") wg.Wait() fmt.Println("Main: Completed")}問題是它在讀取所有文件之前就退出了,我得到了這個輸出:traversing dir: .Main: Waiting for workers to finishwe see file: .gittraversing dir: .gitMain: Completed但是當前目錄中有更多文件,而不僅僅是 .git 文件夾。碰巧 .git 文件夾是當前工作目錄中的第一項,然后立即退出。有人知道為什么我的程序很早就令人興奮嗎?
1 回答

慕沐林林
TA貢獻2016條經驗 獲得超9個贊
由于以下幾行,它正在停止處理:
if f.IsDir() {
traverseDir(f.Name(), wg)
return
}
當它看到一個目錄時,它會進入并立即返回,而不處理當前目錄中的剩余文件。并且當第一個看到的目錄是“.git”時,由于您將其作為異常處理,因此嵌套traverseDir也返回。
- 1 回答
- 0 關注
- 118 瀏覽
添加回答
舉報
0/150
提交
取消