Senior
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 AI
Respuesta de la IA
En este código hay un error clásico de cierre en un bucle al trabajar con goroutines y punteros.
La variable i en el bucle cambia, y en la rebanada nums se añaden punteros a la misma variable i. Como resultado, todos los elementos de nums apuntan al mismo lugar en la memoria, que después de terminar el ciclo contiene el valor 9.
Al lanzar las goroutines, todas imprimirán el mismo valor — la dirección a la que apunta v será la misma para todos los elementos.
Para corregirlo, hay que crear una nueva variable dentro del ciclo, para que cada puntero apunte a un valor separado:
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)
}
}
Aquí creamos val dentro del ciclo y pasamos v como parámetro a una función anónima, lo que garantiza una captura correcta del valor.