Maison > développement back-end > Golang > Pourquoi ce programme affiche-t-il 421 dans le résultat ?

Pourquoi ce programme affiche-t-il 421 dans le résultat ?

王林
Libérer: 2024-02-10 19:48:07
avant
953 Les gens l'ont consulté

Pourquoi ce programme affiche-t-il 421 dans le résultat ?

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.

Contenu de la question

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

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

Solution

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

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal