1.21 func main() { var nums []*int for i := 0; i < 10; i++ { nums = append(nums, &i) } for _, v := range nums { go func() { fmt.Println(v) }() } }
sobes.tech IA
Réponse de l'IA
Dans ce code, il y a une erreur classique de fermeture dans une boucle lors de l'utilisation de goroutines et de pointeurs.
La variable i dans la boucle change, et dans la tranche nums, des pointeurs vers la même variable i sont ajoutés. En fin de compte, tous les éléments de nums pointent vers le même endroit en mémoire, qui après la fin de la boucle contient la valeur 9.
Lors du lancement des goroutines, elles imprimeront toutes la même valeur — l'adresse vers laquelle v pointe sera la même pour tous les éléments.
Pour corriger cela, il faut créer une nouvelle variable à l'intérieur de la boucle, pour que chaque pointeur pointe vers une valeur distincte :
func main() {
var nums []*int
for i := 0; i < 10; i++ {
val := i
nums = append(nums, &val)
}
for _, v := range nums {
go func(v *int) {
fmt.Println(*v)
}(v)
}
}
Ici, nous créons val à l'intérieur de la boucle et passons v comme paramètre à une fonction anonyme, ce qui garantit une capture correcte de la valeur.