Temas importantes de Go

Go defer, panic and recover

Run cleanup code when a function returns, and turn a panic back into an ordinary error.

  • Intermedio
  • 3 min de lectura
  • 1 ejemplo ejecutable
Lo que aprenderás
  • defer
  • Deferred calls run in reverse
  • recover
readConfig()
  1. 1open fileruns first
  2. 2defer closescheduled
  3. 3read settingsruns second
  4. 4close 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.

Puntos clave

  1. A deferred call runs when the function returns.
  2. Several defers run last in, first out.
  3. recover catches a panic inside a deferred function.

Ejemplo ejecutable de Go

Go
Ejecutar código →
main.go
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))
}
Obtén un botón Run para este ejemplo Resultado de ejecutar el código
open file
read settings
close file
5 <nil>
0 recovered: runtime error: integer divide by zero
deferred 3
deferred 2
deferred 1

Practica

Abre el ejemplo en el compilador online, cambia un valor o añade una línea y predice la salida antes de ejecutarlo. Después rompe el código a propósito y lee el mensaje del compilador.

¿Terminaste esta lección?

Márcala como aprendida para seguir tu progreso.

Practica con un reto

Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.

Todos los retos