Senior
12
package main import ( "fmt" "sync" ) func 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("result: %d\n", sum) }
Компании, где спрашивали
Small
Ответ от нейросети
sobes.tech AI
В данном коде есть несколько проблем:
-
Канал
chсоздан без буфера, и в горутинах происходит запись в канал, но в главной функции чтение из канала начинается только послеwg.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("result: %d\n", sum)
}
Теперь программа корректно считает сумму квадратов чисел 0,1,2 и выводит результат.