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.