Rumah >pembangunan bahagian belakang >Golang >Adakah Fungsi Tertunda Melaksanakan Selepas `log.Fatalln()` dalam Go?

Adakah Fungsi Tertunda Melaksanakan Selepas `log.Fatalln()` dalam Go?

Patricia Arquette
Patricia Arquetteasal
2024-11-28 22:09:12790semak imbas

Do Deferred Functions Execute After `log.Fatalln()` in Go?

Pelaksanaan Fungsi Tertunda dengan log.Fatalln()

Dalam Go, fungsi tertunda dilaksanakan apabila fungsi sekeliling kembali, walaupun ia keluar disebabkan panik atau os.Exit(). Walau bagaimanapun, terdapat pengecualian kepada peraturan ini.

log.Fatalln() dan Fungsi Tertunda

Apabila atur cara memanggil fungsi log.Fatalln(), ia mencetak mesej ralat dan kemudian segera keluar dari program dengan kod keluar 1. Yang penting, log.Fatalln() memanggil os.Exit(), yang menghalang kod selebihnya daripada dilaksanakan.

Implikasi untuk Fungsi Tertunda

Ini bermakna jika fungsi tertunda didaftarkan selepas panggilan untuk log.Fatalln(), ia tidak akan dilaksanakan. Ini kerana os.Exit() menamatkan atur cara serta-merta, tanpa memberi masa jalan peluang untuk menjalankan fungsi tertunda.

Demonstrasi

Pertimbangkan kod berikut:

db, err := sql.Open("postgres", "…")
if err != nil {
    log.Fatalln(err)
}
defer db.Close()

tpl, err := template.ParseGlob("")
if err != nil {
    log.Fatalln(err)
}

Dalam contoh ini, jika panggilan log.Fatalln() pertama dilaksanakan kerana ralat pembukaan sambungan pangkalan data, fungsi tertunda db.Close() tidak akan dipanggil kerana program keluar serta-merta selepas panggilan log.Fatalln().

Alternatif untuk log.Fatalln()

Jika anda perlu mengeluarkan sumber dengan betul atau melaksanakan tugas lain sebelum program keluar, anda tidak seharusnya menggunakan log.Fatalln(). Sebaliknya, anda boleh menggunakan log.Println() atau mencetak mesej ralat ke aliran ralat standard dan kemudian panggil os.Exit() secara manual.

Atas ialah kandungan terperinci Adakah Fungsi Tertunda Melaksanakan Selepas `log.Fatalln()` dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn