Rückgabewerte von Goroutinen abfangen
Im Gegensatz zu herkömmlichen Funktionsaufrufen werden Goroutinen asynchron ausgeführt. Daher führt der Versuch, den Rückgabewert einer Goroutine direkt in einer Variablen zu speichern, wie im Codeausschnitt zu sehen ist, zu einem Kompilierungsfehler.
Grund für den Fehler
Der Fehler ist auf die widersprüchliche Natur der asynchronen Ausführung und des sofortigen Wertabrufs zurückzuführen. Wenn Sie eine Goroutine mit go verwenden, weisen Sie das Programm an, die Funktion asynchron auszuführen, ohne auf ihren Abschluss zu warten. Um den Rückgabewert einer Variablen zuzuweisen, muss der Wert jedoch sofort verfügbar sein.
Kanäle: Ein asynchroner Wertübergabemechanismus
Um diese Einschränkung zu umgehen, dienen Kanäle als Vermittler für den Werteaustausch zwischen Goroutinen. Mit Kanälen können Sie Werte von einer Goroutine an eine andere senden und so einen asynchronen Werteabruf ermöglichen, ohne die Parallelität zu unterbrechen.
Durch die Implementierung eines kanalbasierten Ansatzes, wie im folgenden Code veranschaulicht, können Sie Werte von Goroutinen empfangen, ohne deren Beeinträchtigung zu beeinträchtigen asynchrone Natur:
func main() { c1 := make(chan string) c2 := make(chan string) go func() { time.Sleep(time.Second * 1) c1 <- "one" }() go func() { time.Sleep(time.Second * 2) c2 <- "two" }() for i := 0; i < 2; i++ { // Receive values from both channels concurrently select { case msg1 := <-c1: fmt.Println("received", msg1) case msg2 := <-c2: fmt.Println("received", msg2) } } }
Message-Passing und CSP Theorie
Das Nachrichtensystem von Go ist von der CSP-Theorie (Communicating Sequential Processes) inspiriert. Dieser Ansatz fördert die Nachrichtenübermittlung als primären Kommunikationsmechanismus zwischen unabhängigen Prozessen. Der Beispielcode folgt den CSP-Prinzipien, indem er Kanäle für die asynchrone Kommunikation zwischen Goroutinen nutzt.
Das obige ist der detaillierte Inhalt vonWie rufe ich Rückgabewerte von asynchron ausgeführten Goroutinen in Go ab?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!