Sobes.tech
Junior — Middle

Como parar a execução de uma goroutine se o valor esperado ainda não foi atingido?

sobes.tech IA

Resposta da IA

No Go, para parar uma goroutine que espera um valor, mas esse valor pode não chegar, geralmente usam-se canais com timeout ou contexto com cancelamento.

Exemplo com timeout usando select e time.After:

select {
case val := <-ch:
    // valor recebido, continuar o trabalho
case <-time.After(time.Second * 5):
    // timeout, parar a goroutine
}

Outra forma é usar um contexto (context.Context), que pode ser cancelado de fora:

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

go func() {
    select {
    case val := <-ch:
        // processar val
    case <-ctx.Done():
        // parar a goroutine
    }
}()

// em algum momento do código, chamar cancel() para parar a goroutine

Dessa forma, a goroutine não ficará esperando indefinidamente e poderá terminar corretamente.