In Go, the defer
statement is used to delay the execution of a function until the surrounding function returns. This feature leverages Last In, First Out (LIFO) order to ensure that deferred function calls are executed in reverse order of their appearance. This is particularly useful for managing resources, performing cleanup tasks, and ensuring that certain operations are executed regardless of how the function exits.
**defer**
Statement for Stacking Function Calls**defer**
The defer
statement schedules a function call to be executed after the surrounding function completes, but before the function returns. Deferred functions are executed in LIFO order, meaning the last deferred function is executed first.
Syntax:
Example:
Output:
In this example, the output shows that deferred calls are executed in the reverse order of their appearance.
defer
is commonly used for managing resources such as closing files, unlocking mutexes, or releasing network connections. By deferring these operations, you ensure that resources are properly cleaned up even if an error occurs or the function exits prematurely.
: Closing a File
In this example, file.Close()
is deferred to ensure the file is closed when the readFile
function exits, even if an error occurs.
You can defer multiple functions within a single function, and they will be executed in LIFO order. This is useful for managing multiple resources or performing several cleanup actions.
Example: Multiple Deferred Calls
Output:
Here, the deferred cleanup functions are executed in reverse order of their deferral, ensuring the correct sequence of operations.
defer
can be used to recover from panics and handle errors gracefully. By deferring a function that handles panics, you can ensure that your program can recover from unexpected errors.
Example: Recovering from a Panic
Output:
In this example, recover()
is used within a deferred function to handle the panic caused by division by zero, allowing the program to continue running.
The defer
statement in Go is a powerful tool for managing the timing of function calls, ensuring that they execute after the surrounding function completes. By leveraging the LIFO order of deferred calls, you can effectively manage resources, perform cleanup tasks, and handle errors gracefully. Understanding and using defer
appropriately can lead to cleaner, more reliable Go code.