Leitores como você ajudam a apoiar o MUO. Quando você faz uma compra usando links em nosso site, podemos ganhar uma comissão de afiliado. Consulte Mais informação.

O contexto é um dos recursos críticos em Go que permite a simultaneidade. Em Go, “contexto” refere-se a um pacote que fornece funcionalidade para valores com escopo de solicitação e sinais de cancelamento nos limites da API.

O pacote de contexto funciona simultaneamente com o modelo de concorrência do Go, baseado no conceito de goroutines. Goroutines são threads leves de execução que você pode criar e gerenciar com eficiência, facilitando a criação de programas simultâneos em Go.

O pacote de contexto

O pacote de contexto fornece funcionalidade para cancelar funções de execução longa ou cadeias de chamadas inteiras. O pacote também ajuda a armazenar valores com escopo de solicitação para acesso em qualquer lugar dentro da cadeia de chamadas. Esse recurso é útil ao trabalhar com APIs ou microsserviços, onde as solicitações podem abranger várias chamadas de função e você deseja cancelá-las ou anexar valores específicos a elas.

instagram viewer

Veja como você pode importar o pacote de contexto em seu ir programas.

importar"contexto"

As funções de contexto aceitam o Contexto tipo struct do pacote de contexto. Convencionalmente, você deve usar ctx como o nome da variável de instância.

funçãooperações(ctx contexto. Contexto) {
}

As funções podem retornar o tipo struct Context para outras funções e operações.

funçãooperações(ctx contexto. Contexto)contexto.Contexto {
}

Você pode criar um novo contexto com o PENDÊNCIA função do pacote de contexto. A função TODO cria um novo contexto com o valor de contexto. Feito(), um canal que fechará no cancelamento do contexto. Você deve usá-lo como um espaço reservado quando precisar de um contexto, mas nenhum contexto pai for adequado.

importar"contexto"

funçãoprincipal() {
ctx := contexto. PENDÊNCIA()
}

Alternativamente, o Fundo A função cria um novo contexto sem valor e um canal Concluído vazio.

ctx := contexto. Fundo()

Você deve usar a função Background como raiz de uma árvore de contexto.

Contexto com valores

O pacote de contexto fornece funcionalidade para propagar valores e sinais de cancelamento. Você pode usar os valores para obter informações de dados com escopo de solicitação para sinais de cancelamento e prazos.

O pacote de contexto também permite a criação de contexto filho herdado de contextos pai, permitindo manipulação de valores e sinais de cancelamento ao longo de um programa, pois você pode passar o contexto por vários funções.

Aqui está um exemplo de passagem de contexto através de funções com o pacote context.

importar (
"contexto"
)

funçãocontexto valioso(ctx contexto. Contexto)contexto.Contexto {
retornar contexto. ComValor (ctx, "chave de acesso", "hfouneqcelkwfu")
}

funçãoreceiveContextData(ctx contexto. Contexto)qualquer {
senha := ctx. Valor("chave de acesso")
retornar senha
}

O contexto valioso A função recebe uma instância de contexto e retorna uma instância de contexto para a função a seguir. A instância de contexto é um valor criado com o ComValor método. O método WithValue pega a instância de contexto da função e um par chave-valor.

Para recuperar os dados do contexto, você precisará criar um novo contexto com o PENDÊNCIA ou Fundo função e passar o contexto para a função (neste caso, valueContext) e receber o contexto com o receiveContextData função.

funçãoprincipal() {
ctx := contexto. Fundo()
ctx = valiosoContexto (ctx)
fmt. Println (receiveContextData (ctx))

}

A variável ctx é a instância de contexto da função Background. A função valueContext recebe a variável ctx e retorna o contexto com um valor que a função receiveContextData recebe e retorna o valor do par chave-valor.

Limites de tempo e prazos de contexto

O contexto pacote fornece funcionalidade para definir tempos limite e prazos nas operações. Definir tempos limite e prazos é útil para operações que precisam ser atualizadas.

Timeouts são a duração de tempo que uma operação leva. Você pode definir um tempo limite para uma operação de 4 segundos; depois disso, o contexto cancela a solicitação.

Por outro lado, um deadline define o ponto absoluto em que uma operação deve ser cancelada.

Você pode usar o WithTimeout para definir um tempo limite de contexto. Veja como você pode definir um tempo limite de 2 segundos.

funçãoprincipal() {
ctx, cancelar := contexto. WithTimeout (contexto. Fundo(), 2 * tempo. Segundo)
adiar cancelar()

// alguma operação
}

O principal A função cria um contexto com um tempo limite de dois segundos. A função WithTimeout retorna uma função de cancelamento que você pode adiar para cancelamento na saída da função principal.

Você pode declarar prazos com o Com Prazo método. O método WithDeadline considera uma instância de contexto e um prazo final.

funçãofaça alguma coisa(ctx contexto. Contexto) {
deadlineTime := hora. Agora().Adicionar(1500 * tempo. milissegundo)
ctx, ctxCancelar := contexto. WithDeadline (ctx, deadlineTime)
adiar ctxCancelar()

// alguma operação

ctxCancelar()
}

O faça alguma coisa função leva em um contexto, e o deadlineTime variável é o tempo antes do contexto prazo final. O ctx variável é o contexto com um prazo.

O ctxCancelar variável cancela o contexto quando o contexto excede seu deadline.

Melhores práticas para usar contextos em Go

Evite usar contextos como variáveis ​​globais. O uso de contextos como variáveis ​​globais pode levar a comportamentos de código inesperados e erros difíceis de rastrear, e use o contexto com moderação para reduzir a complexidade do código.

Finalmente, use contextos como sinais, não como garantias. Cancelar um contexto não garante que todas as goroutines irão parar de rodar; é meramente um sinal, e as goroutines são independentes de contextos.