gpt4 book ai didi

go - 无法使用 WaitGroup 遍历文件夹

转载 作者:行者123 更新时间:2023-12-01 22:31:31 25 4
gpt4 key购买 nike

我有这个简单的脚本,试图遍历文件系统并逐行读取文件以匹配正则表达式上的行:

package main

import (
"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 finish
we see file: .git
traversing dir: .git
Main: Completed

但是当前目录中的文件比.git文件夹更多。碰巧的是.git文件夹是当前工作目录中的第一项,并且在此之后退出。有人知道为什么我的程序这么早就令人兴奋吗?

最佳答案

由于这些行,它正在停止处理:

if f.IsDir() {
traverseDir(f.Name(), wg)
return
}

当它看到目录时,它将进入该目录并立即返回,而不处理当前目录中的其余文件。当第一个看到的目录是“.git”时,由于您将其作为异常处理,因此嵌套的 traverseDir也将返回。

关于go - 无法使用 WaitGroup 遍历文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60978538/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com