Récupération de la fonction de l'appelant suite aux paniques goroutines des enfants
Contrairement à la croyance populaire, la panique d'une goroutine ne met pas nécessairement fin à l'ensemble du programme. Cette idée fausse vient de l’hypothèse selon laquelle les fonctions de récupération différée chez l’appelant géreront la panique. Cependant, ce n'est pas le cas si l'appelant termine avant que la panique ne se produise dans la goroutine.
Considérons l'exemple suivant :
<code class="go">func fun1() { fmt.Println("fun1 started") defer func() { if err := recover(); err != nil { fmt.Println("recover in func1") } }() go fun2() time.Sleep(10 * time.Second) // wait for the boom! fmt.Println("fun1 ended") } func fun2() { fmt.Println("fun2 started") time.Sleep(5 * time.Second) panic("fun2 booom!") fmt.Println("fun2 ended") }</code>
Malgré la fonction de l'appelant (fun1) qui termine l'exécution, la le programme se termine toujours si fun2 panique. Cela se produit parce que la spécification Go définit que lorsqu'une panique se produit dans une goroutine :
Dans ce cas, fun2 est la fonction de niveau supérieur dans la goroutine, et elle ne se remet pas de la panique. Par conséquent, le programme se termine.
Le point clé est que :
Une goroutine ne peut pas se remettre d'une panique qui se produit dans une autre goroutine.
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!