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.