Rumah >pembangunan bahagian belakang >Golang >Mengapa program ini mencetak 421 dalam hasilnya?

Mengapa program ini mencetak 421 dalam hasilnya?

王林
王林ke hadapan
2024-02-10 19:48:07947semak imbas

Mengapa program ini mencetak 421 dalam hasilnya?

editor php Xiaoxin akan menjawab soalan biasa untuk anda dalam artikel ini: "Mengapa program ini mencetak 421 dalam hasil carian ini?" Kami akan membantu anda memahami dan menyelesaikan isu ini dengan menganalisis kemungkinan punca dan penyelesaian. Baca terus untuk jawapan terperinci.

Kandungan soalan

Saya tidak faham, kenapa program ini mencetak 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())
}

Di bawah saya telah menambah komen tekaan saya:

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
}

Penyelesaian

defer 确实调用该函数,但它recover() 的调用仅在从延迟函数调用时停止紧急状态(defer receive() tidak memenuhi kriteria ini). Lihat Mengapa `deferrecover()` tidak mendapat panik?

Memandangkan ini: mari kita nombor baris:

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

Proses pelaksanaan kod di atas adalah seperti berikut:

l2: Penilaian o() 的参数,调用 f()x 递增到 1 (稍后将打印)。 o() belum dipanggil lagi.

l3: Fungsi tertunda belum dipanggil lagi, seluruh badannya dilangkau buat sementara waktu.

l7: f() 尚未被调用,x 仍为 1.

l8: recover() tidak dipanggil.

l9: Panggil f(),将x递增到2,然后返回,因此2被传递给panic().

Kami berada dalam mod panik, jadi sekarang laksanakan fungsi tertunda (dalam susunan lifo).

l8: recover() dipanggil tetapi tidak menghentikan keadaan panik.

l7: f() 现在被调用,将 x 增加到 3.

l3: Fungsi tanpa nama ini kini dilaksanakan.

l4: recover() 返回 2 (传递给 panic() 的值),这将稍后打印,但尚未打印,因为对 o() Mengembalikan 2 (nilai yang dihantar kepada panic()), yang akan dicetak kemudian, tetapi belum dicetak lagi kerana o() > Panggilan kepada ditangguhkan. Keadaan panik berakhir di sini. <p>l5: Panggil <code>f(),将 x 递增到 4 untuk mencetaknya dengan segera.

l4: Fungsi kelewatan o() 现在被执行,打印上面的值 2.

l2: Fungsi kelewatan o() 现在被执行,打印之前计算的值 1.

Program tamat.

Atas ialah kandungan terperinci Mengapa program ini mencetak 421 dalam hasilnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam