Wie kann man warten, bis alle Goroutinen fertig sind, ohne Zeit zu verbrauchen.

Dieser Code wählt alle XML-Dateien im selben Ordner als aufgerufene ausführbare Datei aus und wendet asynchron die Verarbeitung auf jedes Ergebnis in der Rückrufmethode an (im folgenden Beispiel wird nur der Name der Datei gedruckt).

Wie vermeide ich, die Ruhemethode zu verwenden, um zu verhindern, dass die Hauptmethode beendet wird? Ich habe Probleme, meinen Kopf um Kanäle zu wickeln (ich gehe davon aus, dass es das ist, was nötig ist, um die Ergebnisse zu synchronisieren), sodass jede Hilfe geschätzt wird!

package main

import (
    "fmt"
    "io/ioutil"
    "path"
    "path/filepath"
    "os"
    "runtime"
    "time"
)

func eachFile(extension string, callback func(file string)) {
    exeDir := filepath.Dir(os.Args[0])
    files, _ := ioutil.ReadDir(exeDir)
    for _, f := range files {
            fileName := f.Name()
            if extension == path.Ext(fileName) {
                go callback(fileName)
            }
    }
}


func main() {
    maxProcs := runtime.NumCPU()
    runtime.GOMAXPROCS(maxProcs)

    eachFile(".xml", func(fileName string) {
                // Custom logic goes in here
                fmt.Println(fileName)
            })

    // This is what i want to get rid of
    time.Sleep(100 * time.Millisecond)
}

Antworten auf die Frage(4)

Ihre Antwort auf die Frage