Sobes.tech
Junior — Middle

Como implementar uma finalização segura de uma goroutine quando o resultado esperado não é recebido, usando a construção switch-case?

sobes.tech IA

Resposta da IA

Para terminar de forma segura uma goroutine enquanto espera por um resultado, pode usar a construção select com vários casos, incluindo um tempo limite ou um sinal de cancelamento. Em Go, não há um switch-case direto para canais, mas select desempenha uma função semelhante.

Exemplo com tempo limite:

func worker(done chan struct{}) {
    select {
    case result := <-someChannel:
        fmt.Println("Resultado recebido:", result)
    case <-time.After(5 * time.Second):
        fmt.Println("Tempo limite atingido, a goroutine está a terminar")
        return
    case <-done:
        fmt.Println("Sinal de cancelamento recebido")
        return
    }
}

Aqui, a goroutine espera por dados de someChannel. Se os dados não chegarem em 5 segundos, o tempo limite é acionado e a goroutine termina. Também pode enviar-se um sinal através do canal done para terminar forçadamente.

Esta abordagem evita que a goroutine fique presa e permite controlá-la de forma segura.