Contexto de Golang

Contexto de Golang
Um dos recursos mais úteis da linguagem de programação Go são os contextos. O contexto fornece recursos versáteis para aplicativos, como compartilhar dados, cancelamentos de chamadas, prazos, etc.

Contexto são tão úteis que muitas bibliotecas no ecossistema Go os usem. Você também os encontrará em aplicativos que interagem com servidores remotos, bancos de dados, chamadas de API e mais.

Para este artigo, forneceremos uma introdução iniciante ao pacote de contexto em Go e como usar o contexto para vários casos de uso.

Contexto com valor

Um dos principais casos de uso de contextos no GO é compartilhar dados ou usar valores de solicitação de solicitação. O pacote de contexto de Golang fornece a função WithValue que permite compartilhar dados.

A sintaxe da função é como mostrado:

func withvalue (contexto pai, chave, interface Val ) contexto

A função leva um contexto, chave e valor como os parâmetros. A função criará um novo contexto com base no pai fornecido e adicionará um valor especificado à tecla Definir.

Pense nisso como um contexto interno com um tipo de par de valores-chave dentro. Você pode buscar ou recuperar valores do tipo.

Considere o exemplo abaixo que ilustra como usar a função withvalue e recuperar valores.

Pacote principal
importar "fmt"
importar "contexto"
funcmain ()
ctx: = contexto.Fundo()
ctx = addValues ​​(ctx)
recuperar valores (ctx)

funcaddvalues ​​(contexto CTX.Contexto) contexto.Contexto
contexto de retorno.Withvalue (ctx, "key", "valor")

FuncrerieveValue (contexto CTX.Contexto)
valor: = ctx.Valor ("chave")
fmt.Println (valor)

Concentre -se na função principal do código acima. Começamos criando um novo objeto de contexto, CTX, com o contexto.Função () função.

A função de fundo retornará um contexto não-nil vazio, sem cancelamentos, sem valores e sem prazos.

A função de fundo serve como inicialização para solicitações de contexto recebidas.

Valores do conjunto de contexto

A segunda parte da função é a função addValues ​​(). Tomamos um novo contexto e o ligamos a um contexto existente neste exemplo. O novo contexto é mantido a chave para adicionar ao contexto.

Observe que a função WithValue retorna uma cópia do contexto pai e não modifica o contexto existente.

Contexto recuperar valores

A segunda parte do programa é a função RectrieveValue (). Nesse caso, pegamos a estrutura do contexto e recuperamos os valores associados à chave especificada.

Se a chave existir dentro do contexto, a função deve retornar o valor associado.

Se a chave não existir, a função deve retornar nil. Podemos implementar a lógica condicional para verificar se o valor de retorno é nulo e retornar um erro se verdadeiro.

Contexto com tempo limite

Outro caso de uso comum de contextos é lidar com os times. Por exemplo, pode ser necessário definir um tempo limite em determinadas aplicações se uma ação especificada não for executada. Isso é incrivelmente simples de implementar usando a função Wnestimeout do pacote de contexto. Vejamos como podemos implementar o tempo limite usando o pacote de contexto.

Pacote principal
importação (
"contexto"
"FMT"
"tempo"
)
funcmain ()
CTX, Cancelar: = Contexto.Withtimeout (contexto.Background (), 5*tempo.Segundo)
adiar cancel ()
ctx = addValues ​​(ctx)
GO RETRIEVEVALIES (CTX)
Selecione
caso<-ctx.Done():
fmt.Println ("demorou muito!")

tempo.Sono (5 * tempo.Segundo)

funcaddvalues ​​(contexto CTX.Contexto) contexto.Contexto
contexto de retorno.Withvalue (ctx, "key", "valor")

FuncrerieveValues ​​(contexto de CTX.Contexto)
para
Selecione
caso<-ctx.Done():
fmt.Println ("Timeout")
retornar
padrão:
valor: = ctx.Valor ("chave")
fmt.Println (valor)

tempo.Sono (1 * tempo.Segundo)

Neste exemplo, definimos uma função de cancelamento usando o contexto.Função com tempoout. Podemos então acionar a função cancelada manualmente se considerarmos o ajuste.

Uma vez atingido o valor do tempo limite, a função de cancelamento é chamada e executa a lógica especificada.

Em nossa função de valor de recuperação, recuperamos continuamente o valor com a chave especificada usando o loop for. Também verificamos se o canal feito do contexto principal ainda está vivo. Se o tempo limite não tiver excedido, o contexto pai ainda estará aberto, mas uma vez atingido o tempo limite, o contexto será cancelado.

Em nosso exemplo, a função será executada a cada 1 segundo antes que o tempo limite seja alcançado. Um exemplo de saída é como mostrado:

valor
valor
valor
valor
valor
Demorou muito!
Tempo esgotado

Conclusão

Este foi um tutorial curto e fundamental discutindo contextos e como usá -los em seus programas Go. Você pode verificar a documentação para explorar mais sobre os contextos Go.