Senior
негизги пакет кірүү ( "fmt" "sync" ) функция 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("жыйынтык: %d\n", sum) }
sobes.tech AI
AIден жооп
Бул коддо бир нече көйгөйлөр бар:
-
chканалы буферсиз түзүлгөн жана горутиндер каналга жазып жатат, бирок негизги функцияда каналдан окуу onlywg.Wait()дан кийин башталат. Бул горутиндердин блокко түшүшүнө алып келет, анткени эч ким каналдан окубайт жана канал буферсиз. -
for v := range chцикли чексиз күтөт, анткени канал жабылбаган жана үч маанини жазгандан кийин программа аяктабайт.
Кодду оңдоо үчүн:
- Каналды 3 өлчөмдүү буфер менен кылгыла (горутиндердин саны), ошондо горутиндер маанилерди блоктогусуз жаза алат.
- Бардык горутиндер аяктагандан кийин каналды жабуу.
Туураланган мисал:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // буферленген канал
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) // каналды жабуу
var sum int
for v := range ch {
sum += v
}
fmt.Printf("жыйынтык: %d\n", sum)
}
Эми программа туура эсептейт 0, 1 жана 2 сандардын квадратынын суммасын жана натыйжаны чыгарат.