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.