Timeouts

Os timeouts são importantes para programas que se conectam a recursos externos ou que, de outra forma, precisam limitar o tempo de execução.

Implementar timeouts no Go é fácil e elegante graças aos canais e select.

Para o nosso exemplo, suponha que estejamos executando uma chamada externa que retorna seu resultado em um canal c1 após 2s. Observe que o canal é armazenado em buffer, portanto, o envio na goroutine não é bloqueador.

Este é um padrão comum para evitar vazamentos de goroutine caso o canal nunca seja lido.

Aqui está a seleção de implementação de um tempo limite. res := <-c1 aguarda o resultado e <-time.After aguarda um valor a ser enviado após o tempo limite de 1s.

Como a seleção continua com o primeiro recebimento que está pronto, usaremos o caso de tempo limite se a operação levar mais do que os 1s permitidos.

timeout.go