Senior
hoofd pakket importeer ( "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("resultaat: %d\n", sum) }
sobes.tech AI
Antwoord van AI
In deze code zijn er verschillende problemen:
-
Het kanaal
chwordt zonder buffer gemaakt, en in de goroutines wordt in het kanaal geschreven, maar in de hoofdfunctie begint het lezen uit het kanaal pas nawg.Wait(). Dit leidt tot blokkering van de goroutines, omdat niemand uit het kanaal leest en het kanaal niet gebufferd is. -
De lus
for v := range chwacht oneindig, omdat het kanaal niet gesloten is, en na het schrijven van drie waarden zal het programma niet eindigen.
Om de code te corrigeren:
- Maak het kanaal gebufferd met grootte 3 (aantal goroutines), zodat goroutines waarden kunnen schrijven zonder te blokkeren.
- Sluit het kanaal nadat alle goroutines klaar zijn.
Voorbeeld van de gecorrigeerde code:
package main
import (
"fmt"
"sync"
)
func main() {
ch := make(chan int, 3) // gebufferd kanaal
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) // sluit het kanaal
var sum int
for v := range ch {
sum += v
}
fmt.Printf("resultaat: %d\n", sum)
}
Nu berekent het programma correct de som van de kwadraten van de nummers 0, 1 en 2 en toont het resultaat.