Sobes.tech
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ден жооп

Бул коддо бир нече көйгөйлөр бар:

  1. ch каналы буферсиз түзүлгөн жана горутиндер каналга жазып жатат, бирок негизги функцияда каналдан окуу only wg.Wait()дан кийин башталат. Бул горутиндердин блокко түшүшүнө алып келет, анткени эч ким каналдан окубайт жана канал буферсиз.

  2. 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 сандардын квадратынын суммасын жана натыйжаны чыгарат.