Junior — Middle
Hoe bepaal je welke van de goroutines zal eindigen met het kanaal?
sobes.tech AI
Antwoord van AI
In Go kan je niet rechtstreeks bepalen welke goroutine een kanaal heeft gesloten, omdat kanalen geen informatie bevatten over wie ze sluit. Echter, er wordt meestal een overeenkomst gebruikt:
- De goroutine die naar het kanaal schrijft, is verantwoordelijk voor het sluiten ervan.
- Leesende goroutines krijgen een sluitingssignaal via de tweede waarde bij het lezen:
value, ok := <-ch. Alsok == false, is het kanaal gesloten.
Om te weten welke goroutine het kanaal heeft gesloten, kunnen extra mechanismen worden gebruikt, zoals het verzenden van gestructureerde berichten met identificatoren via het kanaal, of het gebruik van aparte signaalkanalen of contexten (context.Context) voor coördinatie.
Voorbeeld:
ch := make(chan int)
// Goroutine die schrijft en sluit
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine die leest
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Kanaal gesloten")
}()
In dit voorbeeld sluit de eerste goroutine het kanaal. Om expliciet te weten wie het kanaal heeft gesloten, kan je logging toevoegen of extra signaalkanalen gebruiken.