> For the complete documentation index, see [llms.txt](https://ineelhere.gitbook.io/code-with-go/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://ineelhere.gitbook.io/code-with-go/80-exit.md).

# Exit

In this code, the `defer` statement is used to schedule the execution of `fmt.Println("!")` to occur when the surrounding function (`main` in this case) is about to return. However, since `os.Exit(3)` is called immediately after the `defer` statement, the program exits before the deferred function is executed.

Here's what happens:

1. `defer fmt.Println("!")`: Schedules the execution of `fmt.Println("!")` to occur when the surrounding function is about to return.
2. `os.Exit(3)`: Immediately terminates the program with an exit code of 3, and no further deferred functions are executed.

In general, using `defer` before `os.Exit` won't have the intended effect, as `os.Exit` does not allow deferred functions to run. If you want to execute some cleanup logic before exiting, it's recommended to place the cleanup code before the `os.Exit` call.

Here's an example illustrating the behavior:

```go
package main

import (
	"fmt"
	"os"
)

func main() {
	defer fmt.Println("!")

	// The following line won't be executed due to os.Exit.
	os.Exit(3)
}
```

In this example, the deferred `fmt.Println("!")` statement will not be executed, and the program will exit immediately with an exit code/status of 3.

```
exit status 3
```
