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 yapay zeka

AI'dan gelen yanıt

Bu kodda, goroutine ve göstericilerle çalışırken döngüde kapanma hatası vardır.

Döngüdeki i değişiyor ve nums diliminde aynı i göstericileri ekleniyor. Sonuç olarak, nums'un tüm öğeleri aynı bellek konumuna işaret eder ve döngü tamamlandıktan sonra bu konum 9 değerini tutar.

Goroutine'ler başlatıldığında, hepsi aynı değeri yazdıracaktır — v'nin gösterdiği adres tüm öğeler için aynıdır.

Düzeltilmesi için, döngü içinde yeni bir değişken oluşturmak gerekir, böylece her gösterici ayrı bir değere işaret eder:

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öngü içinde val oluşturuyoruz ve v'yi anonim fonksiyona parametre olarak geçiriyoruz, bu da değerin doğru yakalanmasını sağlar.