Rumah >pembangunan bahagian belakang >Golang >Adakah fungsi `defer` akan dilaksanakan selepas panggilan `log.Fatalln()` dalam Go?
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:
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!