Junior — Middle
Cum se determină care dintre goroutine va termina cu canalul?
sobes.tech AI
Răspuns de la AI
În Go, nu se poate determina direct care goroutine a închis un canal, deoarece canalele nu conțin informații despre cine le închide. Cu toate acestea, se folosește de obicei o convenție:
- Goroutine-ul care scrie în canal este responsabil pentru închiderea acestuia.
- Goroutine-urile care citesc primesc un semnal de închidere prin al doilea parametru la citire:
value, ok := <-ch. Dacăok == false, canalul este închis.
Pentru a afla care goroutine a închis canalul, se pot folosi mecanisme suplimentare, cum ar fi transmiterea de mesaje structurate cu identificatori prin canal sau utilizarea unor canale de semnal separate sau a contextelor (context.Context) pentru coordonare.
Exemplu:
ch := make(chan int)
// Goroutine care scrie și închide canalul
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine care citește
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Canal închis")
}()
În acest exemplu, prima goroutine închide canalul. Pentru a ști explicit cine a închis canalul, se poate adăuga logare sau se pot folosi canale de semnal suplimentare.