I see a lot of examples using defer func() inside of a function. Is there a way to keep from repeating it in various places and call it like a normal function?
In this example (and many others) the defer function is nested inside of another function:
package main
import (
"fmt"
"os"
)
func main() {
defer func() {
if err := recover(); err != nil {
fmt.Fprintf(os.Stderr, "Exception: %v
", err)
os.Exit(1)
}
}()
file, err := os.Open(os.Args[1])
if err != nil {
fmt.Println("Could not open file")
}
fmt.Printf("%v", file)
}
Is there a way to move the defer func() outside of main() so it can be used by other functions as well?
You can defer any function. Where that function is defined isn't important.
This is perfectly valid:
func foo() {
// Do foo
}
func bar() {
defer foo()
// Do something before foo
}
func baz() {
defer foo()
// Do something else before foo
}
But in this case foo()
will be called once for each invocation of bar()
and baz()
. It's not "shared", except in the sense that you don't have to re-write an anonymous function multiple times.
Probably the most common example of this is calling Close()
in a defer statement:
func foo() error {
f, err := os.Open(...)
if err != nil {
return err
}
defer f.Close() // "Close()" is obviously not defined here
// do something with f
}
TL;DR;
You cannot share a defer
statement across functions. But as with any other function, the function invoked by defer
, can be called from multiple places.