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) }
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) }
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!