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 ?

王林
王林avant
2024-02-10 19:48:07950parcourir

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

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
}

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

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer