L'éditeur php Xiaoxin répondra pour vous à une question courante dans cet article : "Pourquoi ce programme affiche-t-il 421 dans le résultat ?" Cette question peut impliquer une logique spécifique ou des erreurs dans le programme. Nous vous aiderons à comprendre et à résoudre ce problème en analysant les causes possibles et les solutions. Lisez la suite pour des réponses détaillées.
Je ne comprends pas, pourquoi ce programme imprime-t-il 421
而不是 431
?
package main import "fmt" var x int func f() int { x++ return x } func main() { o := fmt.println defer o(f()) defer func() { defer o(recover()) o(f()) }() defer f() defer recover() panic(f()) }
Ci-dessous, j'ai ajouté mon commentaire supposé :
package main import "fmt" var x int func f() int { x++ return x } func main() { o := fmt.Println defer o(f()) // x=1 defer func() { defer o(recover()) // x=3 from panic (but if we ll execute this program we ll see 2) o(f()) // x=4 }() defer f() // x=2 defer recover() //nil panic(f()) // x=3 }
defer
确实不调用该函数,但它<确实“立即”评估其论点。另外,对 recover()
的调用仅在从延迟函数调用时停止紧急状态(defer receive()
ne répond pas à ce critère). Voir Pourquoi `deferrecover()` n'attrape-t-il pas les paniques ?
Compte tenu de ceci : numérotons les lignes :
L1: o := fmt.Println L2: defer o(f()) // x = 1 L3: defer func() { L4: defer o(recover()) // recover() returns 2 L5: o(f()) // x = 4, it gets printed L6: }() L7: defer f() // after panic: x = 3 L8: defer recover() L9: panic(f()) // x = 2
Le processus d'exécution du code ci-dessus est le suivant :
l2 : L'évaluation o()
的参数,调用 f()
,x
递增到 1
(稍后将打印)。 o()
n'a pas encore été appelée.
l3 : La fonction retardée n'a pas encore été appelée, tout son corps est temporairement ignoré.
l7 : f()
尚未被调用,x
仍为 1
.
l8 : recover()
n’est pas appelé.
l9 : Appelez f()
,将x
递增到2
,然后返回,因此2
被传递给panic()
.
Nous sommes en mode panique, alors exécutez maintenant les fonctions retardées (dans l'ordre Lifo).
l8 : recover()
est appelé mais n'arrête pas l'état de panique.
l7 : f()
现在被调用,将 x
增加到 3
.
l3 : Cette fonction anonyme est maintenant exécutée.
l4 :recover()
返回 2
(传递给 panic()
的值),这将稍后打印,但尚未打印,因为对 o()
Renvoie 2
(la valeur passée à panic()
), qui sera imprimée plus tard, mais n'a pas encore été imprimée à cause de o() > L'appel à est différé. L’état de panique prend fin ici.
<p>l5 : Appelez <code>f()
,将 x
递增到 4
pour l'imprimer immédiatement.
l4 : Fonction retard o()
现在被执行,打印上面的值 2
.
l2 : Fonction retard o()
现在被执行,打印之前计算的值 1
.
Le programme se termine.
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!