En Go, le mot-clé defer peut être utilisé pour différer l'exécution d'une fonction jusqu'au retour de la fonction environnante. Cependant, lorsqu'il est utilisé avec des fermetures anonymes, le comportement peut varier en fonction de la façon dont la fermeture capture ses paramètres.
Considérez le code suivant :
import "fmt" func main() { var whatever [5]struct{} for i := range whatever { fmt.Println(i) } // part 1 for i := range whatever { defer func() { fmt.Println(i) }() } // part 2 for i := range whatever { defer func(n int) { fmt.Println(n) }(i) } // part 3 }
Dans la partie 2, la fermeture ne capture aucun paramètre. Cela signifie que lorsque la fermeture est exécutée, la variable i a la valeur qu'elle avait lors de l'exécution de l'instruction defer. Dans ce cas, j'aurai la valeur de la dernière itération de la boucle for, qui est 4. Par conséquent, le résultat de la partie 2 sera :
4 4 4 4 4
Dans la partie 3, la fermeture capture le paramètre n, qui est initialisé à la valeur de i lors de la création de la fermeture. Cela signifie que lorsque la fermeture est exécutée, n aura la valeur qu'il avait lors de l'exécution de l'instruction defer. Dans ce cas, chaque fermeture capture une valeur différente de i, ce qui donne le résultat :
4 3 2 1 0
La principale différence entre la partie 2 et la partie 3 est que la partie 2 capture le i variable alors que la partie 3 ne le fait pas. Cela affecte le comportement de la fermeture lorsqu'elle est exécutée, conduisant à des sorties différentes.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!