For loop 程序在完成之前退出-for循环中存在并发问题-goroutine不工作

For loop 程序在完成之前退出-for循环中存在并发问题-goroutine不工作,for-loop,go,concurrency,For Loop,Go,Concurrency,当我尝试同时写作时,我的Go项目中断。 我有一个mapmap[string][]字符串。我想同时写入名为key+“.csv”的文件,并为[]字符串的每个值在文件中写入另一行,其中包含该值 我所做的: for key, val := range varValMap { go writeCsv(key, val) } func writeCsv(variable string, values []string) { fName := variable + ".csv

当我尝试同时写作时,我的Go项目中断。

我有一个map
map[string][]字符串。我想同时写入名为
key+“.csv”
的文件,并为
[]字符串的每个值
在文件中写入另一行,其中包含该值

我所做的:

for key, val := range varValMap {
        go writeCsv(key, val)
    }
func writeCsv(variable string, values []string) {
    fName := variable + ".csv"
    fPath := filepath.Join(xmlFolder, "_varval", fName)
    file, err := os.Create(fPath)
    check(err)
    defer file.Close()
    for _, value := range values {
        fmt.Fprintf(file, value + "\n")
    }
}
函数为:

for key, val := range varValMap {
        go writeCsv(key, val)
    }
func writeCsv(variable string, values []string) {
    fName := variable + ".csv"
    fPath := filepath.Join(xmlFolder, "_varval", fName)
    file, err := os.Create(fPath)
    check(err)
    defer file.Close()
    for _, value := range values {
        fmt.Fprintf(file, value + "\n")
    }
}

程序结束时,我没有发现任何问题,但没有完整的结果(一些文件被写入,但其中没有任何内容),而且当我从
go writeCsv(key,val)
中删除
go writeCsv(key,val)
时,go-land中的一切都很好。

您不会等待goroutines完成。这意味着一旦for循环完成并启动所有goroutine,程序就会退出。任何仍在运行的goroutine都将被中止

您可以使用作为等待执行完成的简单方式:

var wg sync.WaitGroup
for key, val := range varValMap {
    wg.Add(1)
    go writeCsv(&wg, key, val)
}
wg.Wait()
并将您的
writeCsv
更改为通知等待组:

func writeCsv(wg *sync.WaitGroup, variable string, values []string) {
    defer wg.Done()
    // do everything.
}

请在主循环周围显示代码。看起来你不是在等待goroutines退出。我希望看到类似于for循环之后没有代码的情况,这是func main()的结尾。这就是您的问题。您的程序在写入任何内容之前退出。