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 AI

Atbilde no AI

Šajā kodā ir klasiska slēgšanas kļūda ciklā, strādājot ar gorutīnām un norādītājiem.

Cikla laikā mainīgais i mainās, un nums sarakstā tiek pievienoti norādītāji uz to pašu mainīgo i. Rezultātā visi nums elementi norāda uz to pašu atmiņas vietu, kas pēc cikla beigām satur vērtību 9.

Kad tiek palaistas gorutīnas, tās visas izdrukās to pašu vērtību — v norādītā adrese būs vienāda visiem elementiem.

Lai to labotu, cikla iekšpusē ir jāizveido jauns mainīgais, lai katrs norādītājs norādītu uz atsevišķu vērtību:

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

Šeit mēs izveidojam val cikla iekšpusē un nododam v kā parametru anonīmai funkcijai, kas nodrošina pareizu vērtības noķeršanu.