Junior — Middle
Come determinare quale delle goroutine terminerà con il canale?
sobes.tech AI
Risposta dell'AI
In Go, non è possibile determinare direttamente quale goroutine ha chiuso un canale, poiché i canali non contengono informazioni su chi li chiude. Tuttavia, di solito si utilizza un accordo:
- La goroutine che scrive nel canale è responsabile della sua chiusura.
- Le goroutine che leggono ricevono un segnale di chiusura tramite il secondo valore durante la lettura:
value, ok := <-ch. Seok == false, il canale è chiuso.
Per capire quale goroutine ha chiuso il canale, si possono usare meccanismi aggiuntivi, come inviare messaggi strutturati con identificatori attraverso il canale, o usare canali di segnale separati o contesti (context.Context) per la coordinazione.
Esempio:
ch := make(chan int)
// Goroutine che scrive e chiude il canale
go func() {
defer close(ch)
ch <- 1
}()
// Goroutine che legge
go func() {
for v := range ch {
fmt.Println(v)
}
fmt.Println("Canale chiuso")
}()
In questo esempio, la prima goroutine chiude il canale. Per sapere esplicitamente chi ha chiuso il canale, si può aggiungere logging o usare canali di segnale aggiuntivi.