Dans Go, l'instruction "defer" permet aux fonctions de différer l'exécution d'un appel de fonction jusqu'à ce que la fonction environnante revient. Ce comportement peut conduire à des résultats inattendus lorsque l'instruction defer capture les paramètres de fermeture.
Partie 2 et partie 3 : le paramètre capturé
Considérez le code suivant :
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
Partie 2 :
Dans la « partie 2 », le L'instruction defer crée une fermeture qui capture la variable "i". Lorsque la fermeture est exécutée, la variable "i" a la valeur qu'elle avait lors de la dernière itération de l'instruction range, qui est 4. Par conséquent, le résultat est "44444".
Partie 3 :
Dans la "partie 3", l'instruction defer crée une fermeture qui ne capture aucune variable externe. Le paramètre "n" de la fermeture est évalué lors de l'exécution de l'instruction defer et reçoit la valeur "i" à ce moment-là. Cela aboutit à la sortie souhaitée de "43210" car chaque appel de fonction différé utilise une valeur différente pour "n". retarder l'exécution des appels de fonction jusqu'au retour de la fonction environnante.
Lorsqu'une fermeture capture un paramètre, la valeur du paramètre est gelée au moment où la fermeture est créé.Lorsqu'une fermeture ne capture aucune variable externe, ses paramètres sont évalués lors de l'exécution de l'instruction defer.
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!