# Defer

## Repousser l'exécution d'une instruction

### Cas d'utilisation

Dans l'exemple si dessous

```go
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**

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

	if condition1 {
		return
	}
}

```

<p class="callout warning">`defer` est rattaché à la fonction qui l'invoque</p>

### Ordre d'exécution

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