Sobes.tech
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.