Was passiert mit den Rückgabewerten von Goroutinen?
Beim Aufrufen einer Funktion aus einer Goroutine geht der zurückgegebene Wert normalerweise verloren, da Goroutinen ihre Funktion haben eigene isolierte Ausführungsumgebung. Während die Funktion ihren zurückgegebenen Wert möglicherweise auf dem Stapel speichert, ist dieser Stapel vom Stapel des Hauptprogramms getrennt und wird zerstört, wenn die Goroutine beendet wird.
Analyse der Funktionsrückgabewerte
Eine Untersuchung der Assembly-Ausgabe für die getNumber-Funktion mit dem Flag -gcflags -S zeigt, dass sie ihren zurückgegebenen Wert tatsächlich speichert Stapel:
"".getNumber t=1 size=16 value=0 args=0x10 locals=0x0 0x0000 00000 (z.go:5) TEXT "".getNumber+0(SB),4,<pre class="brush:php;toolbar:false">func getNumber(i int) int { return i } func main() { for i := 0; i < 10; i++ { go printNumber(i) } time.Sleep(5) }
Dieser Wert wird jedoch auf einem neuen Stapel innerhalb der Goroutine gespeichert, der anschließend zerstört wird, wenn die Goroutine beendet wird, wodurch der Rückgabewert vom Hauptprogramm aus nicht mehr zugänglich ist.
Beispiel
Betrachten Sie den folgenden Code:
func getNumber(i int) chan int { ch := make(chan int) go func() { ch <- i }() return ch } func main() { for i := 0; i < 10; i++ { ch := getNumber(i) num := <-ch fmt.Println(num) } time.Sleep(5) }
In diesem Beispielsweise wird die getNumber-Funktion als Goroutine aufgerufen und ihr Rückgabewert ist nicht sofort verwendbar, da er auf einem separaten Stapel gespeichert ist.
Sollten wir Rückgabewerte in Goroutinen vermeiden?
Um den Verlust von Rückgabewerten zu vermeiden, wird im Allgemeinen empfohlen, Kommunikationsmechanismen wie Kanäle zu verwenden, um Daten zwischen der Goroutine und der Hauptroutine auszutauschen Programm:
Das obige ist der detaillierte Inhalt vonWas passiert mit den Rückgabewerten von Funktionen, die in Goroutinen aufgerufen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!