Middle
Que capacidades oferece a criação de um contexto de dados filho em Go?
sobes.tech IA
Resposta da IA
A criação de um contexto filho (usando context.WithCancel, context.WithDeadline, context.WithTimeout, context.WithValue) oferece as seguintes funcionalidades:
- Cancelamento: Permite cancelar a execução de operações iniciadas no contexto filho sem afetar o pai. Isso é feito chamando a função de cancelamento retornada na criação do contexto.
- Tempo limite / Data limite: Limita o tempo de execução das operações. Se o tempo expirar antes da conclusão da operação, o contexto é cancelado automaticamente.
- Transmissão de valores: Permite transmitir valores específicos da solicitação ou operação para baixo na cadeia de chamadas (por exemplo, identificador de solicitação, dados de autenticação), sem alterar a assinatura das funções.
- Hierarquia: Cria uma estrutura hierárquica de contextos. O cancelamento do contexto pai cancela automaticamente todos os seus contextos filhos.
package main
import (
"context"
"fmt"
"time"
)
func main() {
// Contexto pai, que é cancelado após 3 segundos
parentCtx, cancelParent := context.WithTimeout(context.Background(), 3*time.Second)
defer cancelParent() // Garantir que o contexto pai será cancelado
// Criar um contexto filho com cancelamento
childCtx, cancelChild := context.WithCancel(parentCtx)
defer cancelChild() // Garantir que o contexto filho será cancelado
// Função que espera o cancelamento do contexto
go func(ctx context.Context) {
select {
case <-ctx.Done():
// Este bloco será executado quando o contexto for cancelado
fmt.Println("Goroutine filha cancelada:", ctx.Err())
}
}(childCtx) // Passar o contexto filho para a goroutine
// Atraso artificial para demonstração de cancelamento
time.Sleep(5 * time.Second)
fmt.Println("Programa encerrado")
}
Neste exemplo, o contexto pai com timeout de 3 segundos cancelará automaticamente o contexto filho, o que levará ao término da goroutine. O contexto filho também pode ser cancelado manualmente chamando cancelChild(), antes do timeout do contexto pai.