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.
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 }
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!