Sobes.tech
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 АИ

Одговор од АИ

U ovom kodu postoji klasična greška zatvaranja u petlji prilikom rada sa gorutinama i pokazivačima.

Promenljiva i u petlji se menja, i u niz nums se dodaju pokazivači na istu promenljivu i. Kao rezultat, svi elementi nums ukazuju na isto mesto u memoriji, koje nakon završetka petlje sadrži vrednost 9.

Prilikom pokretanja gorutina, svi će ispisivati istu vrednost — adresa na koju ukazuje v biće ista za sve elemente.

Da biste to ispravili, potrebno je napraviti novu promenljivu unutar petlje, tako da svaki pokazivač ukazuje na odvojenu vrednost:

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)
    }
}

Ovde pravimo val unutar petlje i prosleđujemo v kao parametar anonimnoj funkciji, što garantuje ispravno hvatanje vrednosti.