Sobes.tech
Junior — Middle

Come si può fermare l'esecuzione di una goroutine se il valore atteso non è ancora stato raggiunto?

sobes.tech AI

Risposta dell'AI

In Go, per fermare una goroutine che aspetta un valore, ma tale valore potrebbe non arrivare, si usano generalmente canali con timeout o un contesto con cancellazione.

Esempio con timeout tramite select e time.After:

select {
case val := <-ch:
    // valore ricevuto, continuare il lavoro
case <-time.After(time.Second * 5):
    // timeout, fermare la goroutine
}

Un altro metodo è usare un contesto (context.Context), che può essere cancellato dall'esterno:

ctx, cancel := context.WithCancel(context.Background())

go func() {
    select {
    case val := <-ch:
        // elaborare val
    case <-ctx.Done():
        // fermare la goroutine
    }
}()

// da qualche parte nel codice, chiamare cancel() per fermare la goroutine

In questo modo, la goroutine non rimane in attesa indefinitamente e può terminare correttamente.