Argomenti importanti di 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 di lettura
  • 1 esempio eseguibile
Cosa imparerai
  • 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.

Punti chiave

  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.

Esempio Go eseguibile

Go
Esegui il codice →
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))
}
Crea un pulsante Run per questo esempio Risultato dell'esecuzione
open file
read settings
close file
5 <nil>
0 recovered: runtime error: integer divide by zero
deferred 3
deferred 2
deferred 1

Esercitati

Apri l'esempio nel compilatore online, cambia un valore o aggiungi una riga e prova a prevedere l'output prima di eseguirlo. Poi rompi il codice di proposito e leggi il messaggio del compilatore.

Hai finito questa lezione?

Segnala come imparata per tenere traccia dei tuoi progressi.

Esercitati con una sfida

Usa ciò che questa lezione spiega per risolvere un problema reale. Ogni sfida gira nel browser, con test immediati e una revisione dell'IA.

Tutte le sfide