Senior
hlavný balík 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("výsledok: %d\n", sum) }
sobes.tech AI
Odpoveď od AI
V tomto kóde je niekoľko problémov:
-
Kanál
chje vytvorený bez bufferu, a v gorutinách sa zapisuje do kanála, ale v hlavnej funkcii sa čítanie z kanála začína až powg.Wait(). To spôsobí zablokovanie gorutín, pretože nikto nečíta z kanála a kanál nie je buffered. -
Cyklus
for v := range chbude čakať do nekonečna, pretože kanál nie je zatvorený, a po zápise troch hodnôt sa program neskončí.
Na opravu kódu:
- Urobte kanál buffered s veľkosťou 3 (počet gorutín), aby gorutiny mohli zapisovať hodnoty bez blokovania.
- Zatvorte kanál po tom, čo všetky gorutiny skončia.
Príklad opraveného kódu:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // buffered kanál
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) // zatvárame kanál
var sum int
for v := range ch {
sum += v
}
fmt.Printf("výsledok: %d\n", sum)
}
Teraz program správne vypočíta súčet štvorcov čísel 0, 1 a 2 a zobrazí výsledok.