Skip to main content

Defer

Repousser l'exécution d'une instruction

Cas d'utilisation

Dans l'exemple si dessous

func main() {
	f := os.OpenFile("foo.txt")
	if condition1 {
		return // Oops...! pas de close ici!
	}
	// code
	f.Close()
}

Le f.close() peut être très éloigné dans le code du OpenFile.
Or, quand on ouvre un fichier, on va surement le fermer ensuite, mais pas tout de suite...

On peut même potentiellement arrêter notre fonction avant de fermer le fichier sans faire attention !

Il paraît donc plus "jolie" de mettre le code d'ouverture du fichier et celui de fermeture côte à côte, car il traite le même sujet.

Solution

func main() {
	f := os.OpenFile("foo.txt")
	defer f.Close() // exécuté quand on sort de main()

	if condition1 {
		return
	}
}

defer est rattaché à la fonction qui l'invoque

Ordre d'exécution

Les instructions mises en defer fonctionnerons comme une pile LIFO (Last In First Out).