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

  1. Het kanaal ch wordt zonder buffer gemaakt, en in de goroutines wordt in het kanaal geschreven, maar in de hoofdfunctie begint het lezen uit het kanaal pas na wg.Wait(). Dit leidt tot blokkering van de goroutines, omdat niemand uit het kanaal leest en het kanaal niet gebufferd is.

  2. De lus for v := range ch wacht 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.