Go defer, panic and recover
Run cleanup code when a function returns, and turn a panic back into an ordinary error.
- defer
- Deferred calls run in reverse
- recover
- 1
open fileruns first - 2
defer closescheduled - 3
read settingsruns second - 4
close fileruns on return
Cleanup that always runs
defer schedules a call to run when the surrounding function returns, which makes it the usual way to close files and release locks. A panic stops the normal flow, and recover, called in a deferred function, catches it.
close file prints after read settings because the deferred call runs when readConfig returns. Dividing by zero panics; the deferred function recovers and stores an error in the named result err. The three deferred calls in main run last, in reverse order.
Points clés
- A deferred call runs when the function returns.
- Several defers run last in, first out.
- recover catches a panic inside a deferred function.
Exemple Go exécutable
package main
import "fmt"
func readConfig() {
fmt.Println("open file")
defer fmt.Println("close file") // runs when the function returns
fmt.Println("read settings")
}
func safeDivide(a, b int) (result int, err error) {
defer func() {
if r := recover(); r != nil {
err = fmt.Errorf("recovered: %v", r)
}
}()
return a / b, nil
}
func main() {
readConfig()
for i := 1; i <= 3; i++ {
defer fmt.Println("deferred", i) // last in, first out
}
fmt.Println(safeDivide(10, 2))
fmt.Println(safeDivide(1, 0))
}
open file
read settings
close file
5 <nil>
0 recovered: runtime error: integer divide by zero
deferred 3
deferred 2
deferred 1S'entraîner
Leçon terminée ?
Marquez-la comme apprise pour suivre votre progression.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
Tous les défis