defer đảm bảo một function sẽ được gọi khi function chứa nó return (LIFO). panic dừng chương trình khi gặp lỗi không thể khôi phục. recover bắt panic bên trong deferred function.
go
// defer — cleanup đảm bảo luôn chạy
func processFile(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // luôn đóng file khi function return
// xử lý file...
return nil
}
// panic + recover — bắt lỗi nghiêm trọng
func safeDiv(a, b int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("recovered: %v", r)
}
}()
return a / b, nil // panic nếu b == 0
}
// defer chạy LIFO
defer fmt.Println("1") // chạy thứ 3
defer fmt.Println("2") // chạy thứ 2
defer fmt.Println("3") // chạy thứ 1Trong thực tế, hạn chế dùng panic/recover và ưu tiên trả error thông thường.
defer guarantees a function call when the surrounding function returns (LIFO order). panic immediately stops execution on an unrecoverable error. recover catches a panic inside a deferred function.
go
// defer — guaranteed cleanup
func processFile(path string) error {
f, err := os.Open(path)
if err != nil {
return err
}
defer f.Close() // always closes the file on return
// process file...
return nil
}
// panic + recover — catch critical failures
func safeDiv(a, b int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("recovered: %v", r)
}
}()
return a / b, nil // panics if b == 0
}
// defers execute LIFO
defer fmt.Println("1") // runs 3rd
defer fmt.Println("2") // runs 2nd
defer fmt.Println("3") // runs 1stIn practice, minimize panic/recover and prefer returning errors normally.