Rumah >pembangunan bahagian belakang >Golang >Adakah fungsi `defer` akan dilaksanakan selepas panggilan `log.Fatalln()` dalam Go?

Adakah fungsi `defer` akan dilaksanakan selepas panggilan `log.Fatalln()` dalam Go?

Barbara Streisand
Barbara Streisandasal
2024-12-07 19:44:14434semak imbas

Will `defer` functions execute after a `log.Fatalln()` call in Go?

Fungsi Tertunda dan log.Panggilan Fatalln()

Masalah:

Pertimbangkan kod Go 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)
}

Jika templat.ParseGlob("") mengembalikan ralat, adakah Fungsi db.Close() dipanggil?

Jawapan:

Tidak, fungsi tertunda tidak akan dilaksanakan dalam senario ini.

Penjelasan:

log.Fatalln() ialah fungsi pengelogan yang mencetak mesej ralat dan kemudian memanggil os.Exit(1) untuk menamatkan atur cara serta-merta. Berikut ialah pecahan:

  • log.Fatalln() bersamaan dengan log.Print() diikuti dengan os.Exit(1).
  • os.Exit() menyebabkan atur cara keluar dengan kod status yang ditentukan (dalam kes ini, 1 untuk kegagalan).
  • Fungsi tertunda (seperti db.Close()) tidak dijalankan apabila os.Exit() dipanggil.

Dalam coretan kod, jika panggilan ke templat.ParseGlob("") gagal dan log.Fatalln() dicetuskan, program akan keluar serta-merta. Akibatnya, fungsi tertunda db.Close() tidak akan dilaksanakan, berpotensi membiarkan sambungan pangkalan data terbuka.

Demonstrasi:

Untuk menggambarkan tingkah laku ini, kod berikut boleh dilaksanakan:

package main

import (
    "log"
    "os"
)

func main() {
    defer os.Exit(1) // Exit the program with status code 1
    log.Fatalln("Program terminated early")
}

Menjalankan kod ini akan menyebabkan mesej ralat menjadi dilog dan program keluar serta-merta, tanpa sebarang fungsi tertunda dilaksanakan.

Pengelak:

Untuk mengelakkan isu dengan sumber yang tidak ditutup dengan betul atau tugas yang tidak dikendalikan, pertimbangkan untuk menggunakan log.Println () untuk mengelog ralat dan mengendalikan ralat dengan anggun tanpa menamatkan program.

Atas ialah kandungan terperinci Adakah fungsi `defer` akan dilaksanakan selepas panggilan `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