Sobes.tech
Junior — Middle

Come implementare una terminazione sicura di una goroutine quando il risultato atteso non viene ricevuto, utilizzando la struttura switch-case?

sobes.tech AI

Risposta dell'AI

Per terminare in modo sicuro una goroutine mentre si aspetta un risultato, si può usare la costruzione select con più casi, inclusi timeout o segnale di cancellazione. In Go, non esiste un switch-case diretto per i canali, ma select svolge una funzione simile.

Esempio con timeout:

func worker(done chan struct{}) {
    select {
    case result := <-someChannel:
        fmt.Println("Risultato ricevuto:", result)
    case <-time.After(5 * time.Second):
        fmt.Println("Timeout scaduto, terminazione della goroutine")
        return
    case <-done:
        fmt.Println("Segnale di terminazione ricevuto")
        return
    }
}

Qui, la goroutine aspetta dati da someChannel. Se i dati non arrivano entro 5 secondi, scatta il timeout e la goroutine termina. È anche possibile inviare un segnale tramite il canale done per terminarla forzatamente.

Questo approccio evita che la goroutine rimanga bloccata e permette di controllarla in modo sicuro.