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е създаден без буфер, и в горутините се пише в канала, но в главната функция четенето от канала започва само след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("резултат: %d\n", sum)
}
Сега програмата правилно изчислява сумата на квадратите на числата 0, 1 и 2 и показва резултата.