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 е създаден без буфер, и в горутините се пише в канала, но в главната функция четенето от канала започва само след 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 и показва резултата.