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.