Sobes.tech
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

В данном коде есть несколько проблем:

  1. Канал ch создан без буфера, и в горутинах происходит запись в канал, но в главной функции чтение из канала начинается только после 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("result: %d\n", sum)
}

Теперь программа корректно считает сумму квадратов чисел 0,1,2 и выводит результат.