Sobes.tech
Junior — Middle

Quel est le résultat de l'assignation d'une valeur à une variable en utilisant la construction defer, lorsque sa valeur est définie à l'intérieur d'une fonction?

sobes.tech IA

Réponse de l'IA

En Go, le mot-clé defer retarde l'exécution d'une fonction jusqu'à ce que la fonction englobante se termine. Les arguments de la fonction passée à defer sont évalués immédiatement au moment de la déclaration de defer, et non lors de son exécution.

Si une variable est utilisée à l'intérieur de la fonction appelée via defer, la valeur de la variable sera celle au moment de la déclaration de defer, si elle est passée en argument. Si la variable est utilisée directement (par exemple, via une fermeture), sa valeur actuelle au moment de l'exécution de la fonction différée sera utilisée.

Exemple:

func exemple() {
    x := 1
    defer fmt.Println(x) // x sera 1, car l'argument est évalué immédiatement
    x = 2
}

// Lors de l'appel de exemple(), il affichera : 1

Si on utilise une fermeture:

func exemple() {
    x := 1
    defer func() { fmt.Println(x) }() // la fonction sera appelée à la sortie, x sera 2
    x = 2
}

// Lors de l'appel de exemple(), il affichera : 2

Ainsi, le résultat de l'affectation à une variable dans defer dépend de la façon dont la variable est utilisée — comme argument de fonction ou via une fermeture.