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
Risposta dell'AI
In questo codice c'è un errore classico di chiusura nel ciclo quando si lavora con goroutine e puntatori.
La variabile i nel ciclo cambia, e nel slice nums vengono aggiunti puntatori alla stessa variabile i. Alla fine, tutti gli elementi di nums puntano allo stesso luogo in memoria, che dopo il ciclo contiene il valore 9.
Quando vengono avviate le goroutine, tutte stamperanno lo stesso valore — l'indirizzo a cui punta v sarà lo stesso per tutti gli elementi.
Per correggere, bisogna creare una nuova variabile all'interno del ciclo, in modo che ogni puntatore punti a un valore separato:
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)
}
}
Qui creiamo val all'interno del ciclo e passiamo v come parametro a una funzione anonima, garantendo una cattura corretta del valore.