Maison > développement back-end > Golang > Qu'arrive-t-il aux valeurs de retour des fonctions appelées dans les Goroutines ?

Qu'arrive-t-il aux valeurs de retour des fonctions appelées dans les Goroutines ?

Mary-Kate Olsen
Libérer: 2024-12-06 07:49:14
original
814 Les gens l'ont consulté

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

Qu'arrive-t-il aux valeurs renvoyées par les goroutines ?

Lors de l'appel d'une fonction à partir d'une goroutine, la valeur renvoyée est généralement perdue puisque les goroutines ont leur propre environnement d’exécution isolé. Bien que la fonction puisse stocker sa valeur renvoyée sur la pile, cette pile est distincte de la pile du programme principal et est détruite à la sortie de la goroutine.

Analyse des valeurs de retour de la fonction

L'examen de la sortie de l'assembly pour la fonction getNumber à l'aide de l'indicateur -gcflags -S révèle qu'elle stocke la valeur renvoyée sur le stack :

"".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)
}
Copier après la connexion
-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

Cependant, cette valeur est stockée sur une nouvelle pile au sein de la goroutine, qui est ensuite détruite à la fin de la goroutine, rendant la valeur de retour inaccessible depuis le programme principal.

Exemple

Considérez le code suivant :

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)
}
Copier après la connexion

Dans ce Par exemple, la fonction getNumber est invoquée en tant que goroutine et sa valeur de retour n'est pas immédiatement utilisable car elle est stockée sur une pile distincte.

Devrions-nous éviter les valeurs de retour dans les goroutines ?

Pour éviter de perdre les valeurs de retour, il est généralement recommandé d'utiliser des mécanismes de communication tels que des canaux pour partager des données entre la goroutine et la principale. programme :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal