Sobes.tech
Junior — Middle

Come si comporta il programma quando si utilizza range per leggere da un canale non bufferizzato chiuso?

sobes.tech AI

Risposta dell'AI

Utilizzando range per leggere da un canale in Go, il ciclo riceverà valori dal canale fino a quando non verrà chiuso. Se il canale è chiuso e tutti i valori sono stati letti, range terminerà il ciclo.

Per un canale senza buffer, funziona allo stesso modo di uno con buffer: se il canale è chiuso, range non blocca e esce dal ciclo.

Esempio:

ch := make(chan int)
func() {
    ch <- 1
    ch <- 2
    close(ch)
}()

for v := range ch {
    fmt.Println(v) // Stampa 1 e 2, poi termina il ciclo
}

Se il canale è chiuso ma non ci sono dati, range terminerà immediatamente. Se il canale non è chiuso ma non ci sono dati, range aspetterà (si bloccherà) fino all'arrivo di dati o alla chiusura del canale.