_Defer_ is used to ensure that a function call is performed later in a program's execution, usually for purposes of cleanup. `defer` is often used where e.g. `ensure` and `finally` would be used in other languages. | ||
package main |
||
import ( |
||
"fmt" |
||
"os" |
||
) |
||
Suppose we wanted to create a file, write to it, and then close when we're done. Here's how we could do that with `defer`. | func main() { |
|
Immediately after getting a file object with `createFile`, we defer the closing of that file with `closeFile`. This will be executed at the end of the enclosing function (`main`), after `writeFile` has finished. | f := createFile("/tmp/defer.txt") |
|
defer closeFile(f) |
||
writeFile(f) |
||
} |
||
func createFile(p string) *os.File { |
||
fmt.Println("creating") |
||
f, err := os.Create(p) |
||
if err != nil { |
||
panic(err) |
||
} |
||
return f |
||
} |
||
func writeFile(f *os.File) { |
||
fmt.Println("writing") |
||
fmt.Fprintln(f, "data") |
||
} |
||
func closeFile(f *os.File) { |
creating writing |
|
fmt.Println("closing") |
closing |
|
err := f.Close() |
||
It's important to check for errors when closing a file, even in a deferred function. | if err != nil { |
|
fmt.Fprintf(os.Stderr, "error: %v\n", err) |
||
os.Exit(1) |
||
} |
||
} |