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 Süni İntellekt

AI-dan cavab

Bu kodda, gorutinlar və göstəricilərlə işləyərkən dövrədə bağlanma ilə bağlı klassik səhv mövcuddur.

Dövrədəki i dəyişir və nums dilimində eyni i göstəriciləri əlavə olunur. Nəticədə, nums-un bütün elementləri eyni yaddaş yerinə işarə edir və dövr bitdikdən sonra bu yer 9 dəyərini saxlayır.

Gorutinlər başladıqda, onlar hamısı eyni dəyəri çap edəcək — v-nin göstərdiyi ünvan bütün elementlər üçün eyni olacaq.

Bunu düzəltmək üçün, dövrədə yeni bir dəyişən yaratmaq lazımdır ki, hər bir göstərici ayrı bir dəyərə işarə etsin:

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

Burada, dövrədə val yaradılır və v anonim funksiyaya parametr kimi ötürülür, bu da düzgün dəyər tutmağı təmin edir.