Heim > Backend-Entwicklung > Golang > Was passiert mit den Rückgabewerten von Funktionen, die in Goroutinen aufgerufen werden?

Was passiert mit den Rückgabewerten von Funktionen, die in Goroutinen aufgerufen werden?

Mary-Kate Olsen
Freigeben: 2024-12-06 07:49:14
Original
816 Leute haben es durchsucht

What Happens to the Return Values of Functions Called within Goroutines?

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)
}
Nach dem Login kopieren
-16 0x0000 00000 (z.go:6) MOVQ "".i+8(FP),BX 0x0005 00005 (z.go:6) MOVQ BX,"".~r1+16(FP) 0x000a 00010 (z.go:6) RET

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)
}
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage