Go

defer / panic / recover

admin by @admin ADMIN
1h ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
`defer` runs a statement when the enclosing function returns — LIFO order. `panic` aborts; `recover` (inside a deferred func) catches a panic and converts it back to a normal return. Use sparingly.
Go
Raw
package main

import (
    "fmt"
    "os"
)

func processFile(path string) error {
    f, err := os.Open(path)
    if err != nil {
        return err
    }
    defer f.Close()                          // runs on every return path
    // ... use f ...
    return nil
}

func safeDivide(a, b int) (result int, err error) {
    defer func() {
        if r := recover(); r != nil {
            err = fmt.Errorf("recovered from panic: %v", r)
        }
    }()
    return a / b, nil                        // panics if b == 0
}

func main() {
    r, err := safeDivide(10, 0)
    fmt.Printf("result=%d err=%v\n", r, err)
    // result=0 err=recovered from panic: runtime error: integer divide by zero

    // defers run in LIFO order
    defer fmt.Println("third")
    defer fmt.Println("second")
    defer fmt.Println("first")
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.