Senior
asosiy paket kiritish ( "fmt" "sync" ) fun main() { ch := make(chan int) wg := &sync.WaitGroup{} wg.Add(3) for i := 0; i < 3; i++ { go func(v int) { defer wg.Done() ch <- v * v }(i) } wg.Wait() var sum int for v := range ch { sum += v } fmt.Printf("natija: %d\n", sum) }
sobes.tech AI
AIdan javob
Ushbu kodda bir nechta muammo mavjud:
-
chkanali bufersiz yaratilgan va gorutinlarda kanalga yozish amalga oshirilmoqda, ammo asosiy funksiyada kanalni o'qish faqatwg.Wait()dan so'ng boshlanadi. Bu gorutinlarning bloklanishiga olib keladi, chunki hech kim kanaldan o'qmayapti va kanal buferlangan emas. -
for v := range chsikli cheksiz kutadi, chunki kanal yopilmagan va uchta qiymat yozilgandan so'ng, dastur tugamaydi.
Kodni tuzatish uchun:
- Kanalni 3 o'lchovli bufer bilan qilish (gorutinlar soni), shunda gorutinlar qiymatlarni bloklamasdan yozishlari mumkin.
- Barcha gorutinlar tugagach, kanali yopish.
Tuzatilgan misol:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // buferli kanal
wg := &sync.WaitGroup{}
wg.Add(3)
for i := 0; i < 3; i++ {
go func(v int) {
defer wg.Done()
ch <- v * v
}(i)
}
wg.Wait()
close(ch) // kanali yopamiz
var sum int
for v := range ch {
sum += v
}
fmt.Printf("natija: %d\n", sum)
}
Endi dastur 0, 1 va 2 sonlarining kvadratlarining yig'indisini to'g'ri hisoblaydi va natijani chiqaradi.