<!-- Defer, Panic, and Recover -->

<p>
Go has the usual mechanisms for control flow: if, for, switch, goto.  It also
has the go statement to run code in a separate goroutine.  Here I'd like to
discuss some of the less common ones: defer, panic, and recover.
</p>
 
<p>
A <b>defer statement</b> pushes a function call onto a list. The list of saved
calls is executed after the surrounding function returns. Defer is commonly
used to simplify functions that perform various clean-up actions.
</p>
 
<p>
For example, let's look at a function that opens two files and copies the
contents of one file to the other:
</p>
 
<pre><!--{{code "progs/defer.go" `/func CopyFile/` `/STOP/`}}
-->func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }

    written, err = io.Copy(dst, src)
    dst.Close()
    src.Close()
    return
}
</pre>

<p>
This works, but there is a bug. If the second call to os.Open fails, the
function will return without closing the source file. This can be easily
remedied by putting a call to src.Close() before the second return statement,
but if the function were more complex the problem might not be so easily
noticed and resolved. By introducing defer statements we can ensure that the
files are always closed:
</p>
 
<pre><!--{{code "progs/defer2.go" `/func CopyFile/` `/STOP/`}}
-->func CopyFile(dstName, srcName string) (written int64, err error) {
    src, err := os.Open(srcName)
    if err != nil {
        return
    }
    defer src.Close()

    dst, err := os.Create(dstName)
    if err != nil {
        return
    }
    defer dst.Close()

    return io.Copy(dst, src)
}
</pre>

<p>
Defer statements allow us to think about closing each file right after opening
it, guaranteeing that, regardless of the number of return statements in the
function, the files <i>will</i> be closed.
</p>
 
<p>
The behavior of defer statements is straightforward and predictable. There are
three simple rules:
</p>
 
<p>
1. <i>A deferred function's arguments are evaluated when the defer statement is
evaluated.</i> 
</p>
 
<p>
In this example, the expression "i" is evaluated when the Println call is
deferred. The deferred call will print "0" after the function returns.
</p>
 
<pre><!--{{code "progs/defer.go" `/func a/` `/STOP/`}}
-->func a() {
    i := 0
    defer fmt.Println(i)
    i++
    return
}
</pre>

<p>
2. <i>Deferred function calls are executed in Last In First Out order
</i>after<i> the surrounding function returns.</i> 
</p>
 
<p>
This function prints "3210":
</p>

<pre><!--{{code "progs/defer.go" `/func b/` `/STOP/`}}
-->func b() {
    for i := 0; i &lt; 4; i++ {
        defer fmt.Print(i)
    }
}
</pre>
 
<p>
3. <i>Deferred functions may read and assign to the returning function's named
return values.</i> 
</p>
 
<p>
In this example, a deferred function increments the return value i <i>after</i>
the surrounding function returns. Thus, this function returns 2:
</p>

<pre><!--{{code "progs/defer.go" `/func c/` `/STOP/`}}
-->func c() (i int) {
    defer func() { i++ }()
    return 1
}
</pre>
 
<p>
This is convenient for modifying the error return value of a function; we will
see an example of this shortly.
</p>
 
<p>
<b>Panic</b> is a built-in function that stops the ordinary flow of control and
begins <i>panicking</i>. When the function F calls panic, execution of F stops,
any deferred functions in F are executed normally, and then F returns to its
caller. To the caller, F then behaves like a call to panic. The process
continues up the stack until all functions in the current goroutine have
returned, at which point the program crashes. Panics can be initiated by
invoking panic directly. They can also be caused by runtime errors, such as
out-of-bounds array accesses.
</p>
 
<p>
<b>Recover</b> is a built-in function that regains control of a panicking
goroutine. Recover is only useful inside deferred functions. During normal
execution, a call to recover will return nil and have no other effect. If the
current goroutine is panicking, a call to recover will capture the value given
to panic and resume normal execution.
</p>
 
<p>
Here's an example program that demonstrates the mechanics of panic and defer:
</p>

<pre><!--{{code "progs/defer2.go" `/package main/` `/STOP/`}}
-->package main

import &#34;fmt&#34;

func main() {
    f()
    fmt.Println(&#34;Returned normally from f.&#34;)
}

func f() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println(&#34;Recovered in f&#34;, r)
        }
    }()
    fmt.Println(&#34;Calling g.&#34;)
    g(0)
    fmt.Println(&#34;Returned normally from g.&#34;)
}

func g(i int) {
    if i &gt; 3 {
        fmt.Println(&#34;Panicking!&#34;)
        panic(fmt.Sprintf(&#34;%v&#34;, i))
    }
    defer fmt.Println(&#34;Defer in g&#34;, i)
    fmt.Println(&#34;Printing in g&#34;, i)
    g(i + 1)
}
</pre>
 
<p>
The function g takes the int i, and panics if i is greater than 3, or else it
calls itself with the argument i+1. The function f defers a function that calls
recover and prints the recovered value (if it is non-nil). Try to picture what
the output of this program might be before reading on.
</p>
 
<p>
The program will output:
</p>
 
<pre>Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
Recovered in f 4
Returned normally from f.</pre> 

<p>
If we remove the deferred function from f the panic is not recovered and
reaches the top of the goroutine's call stack, terminating the program. This
modified program will output:
</p>
 
<pre>Calling g.
Printing in g 0
Printing in g 1
Printing in g 2
Printing in g 3
Panicking!
Defer in g 3
Defer in g 2
Defer in g 1
Defer in g 0
panic: 4
 
panic PC=0x2a9cd8
[stack trace omitted]</pre> 

<p>
For a real-world example of <b>panic</b> and <b>recover</b>, see the
<a href="/pkg/encoding/json/">json package</a> from the Go standard library.
It decodes JSON-encoded data with a set of recursive functions.
When malformed JSON is encountered, the parser calls panic is to unwind the
stack to the top-level function call, which recovers from the panic and returns
an appropriate error value (see the 'error' and 'unmarshal' functions in
<a href="/src/pkg/encoding/json/decode.go">decode.go</a>).
</p>

<p>
The convention in the Go libraries is that even when a package uses panic
internally, its external API still presents explicit error return values.
</p>
 
<p>
Other uses of <b>defer</b> (beyond the file.Close() example given earlier)
include releasing a mutex:
</p>

<pre>mu.Lock()
defer mu.Unlock()</pre> 

<p>
printing a footer:
</p>
 
<pre>printHeader()
defer printFooter()</pre> 

<p>
and more.
</p>
 
<p>
In summary, the defer statement (with or without panic and recover) provides an
unusual and powerful mechanism for control flow.  It can be used to model a
number of features implemented by special-purpose structures in other
programming languages. Try it out.
</p>
