Contesto di golang

Contesto di golang
Una delle caratteristiche più utili nel linguaggio di programmazione Go sono i contesti. Il contesto fornisce funzionalità versatili per applicazioni come la condivisione di dati, cancellazioni dei chiamanti, scadenze, ecc.

Il contesto è così utile che molte biblioteche nell'ecosistema Go le usano. Li troverai anche in applicazioni che interagiscono con server remoti, database, chiamate API e altro ancora.

Per questo articolo, forniremo un'introduzione per principianti al pacchetto contesto in Go e come utilizzare il contesto per vari casi d'uso.

Contesto con il valore

Uno dei principali casi d'uso di contesti in GO è la condivisione dei dati o l'utilizzo di valori con accoppiamento. Il pacchetto contesto di Golang fornisce la funzione WithValue che consente di condividere i dati.

La sintassi della funzione è come mostrata:

func withValue (contesto genitore, chiave, interfaccia val ) contesto

La funzione prende un contesto, una chiave e un valore come parametri. La funzione creerà quindi un nuovo contesto in base al genitore fornito e aggiungerà un valore specificato al tasto SET.

Pensalo come un contesto interno con un tipo di coppia di valore chiave all'interno. È quindi possibile recuperare o recuperare i valori dal tipo.

Considera l'esempio seguente che illustra come utilizzare la funzione WithValue e recuperare i valori da essa.

Pacchetto principale
Importa "FMT"
Importa "contesto"
funcmain ()
CTX: = contesto.Sfondo()
CTX = addValues ​​(CTX)
RetrieveValue (CTX)

FunCaddValues ​​(contesto CTX.Contesto) contesto.Contesto
Contesto di restituzione.WithValue (ctx, "chiave", "valore")

FunCretrieveValue (contesto CTX.Contesto)
Valore: = CTX.Valore ("chiave")
fmt.Println (valore)

Concentrati sulla funzione principale del codice sopra. Iniziamo creando un nuovo oggetto contesto, CTX, con il contesto.Funzione di sfondo ().

La funzione di sfondo restituirà quindi un contesto vuoto non NIL senza cancellazioni, nessun valori e nessuna scadenza.

La funzione di fondo funge da inizializzazione per le richieste di contesto in arrivo.

Valori di set di contesto

La seconda parte della funzione è la funzione AddValues ​​(). Prendiamo un nuovo contesto e lo legiamo a un contesto esistente in questo esempio. Il nuovo contesto contiene la chiave da aggiungere al contesto.

Si noti che la funzione WithValue restituisce una copia del contesto genitore e non modifica il contesto esistente.

Contesto recuperare i valori

La seconda parte del programma è la funzione RetrieveValue (). In questo caso, prendiamo la struttura di contesto e recuperiamo i valori associati alla chiave specificata.

Se la chiave esiste nel contesto, la funzione dovrebbe restituire il valore associato.

Se la chiave non esiste, la funzione dovrebbe restituire zero. Possiamo implementare la logica condizionale per verificare se il valore di restituzione è nullo e restituire un errore se vero.

Contesto con timeout

Un altro caso d'uso comune di contesti è la gestione dei timeout. Ad esempio, potrebbe essere necessario definire un timeout in determinate applicazioni se non viene eseguita un'azione specificata. Questo è incredibilmente semplice da implementare utilizzando la funzione withTimeout dal pacchetto di contesto. Diamo un'occhiata a come possiamo implementare il timeout usando il pacchetto di contesto.

Pacchetto principale
importazione (
"contesto"
"FMT"
"tempo"
)
funcmain ()
ctx, annulla: = contesto.Withtimeout (contesto.Background (), 5*Tempo.Secondo)
Defer Annuban ()
CTX = addValues ​​(CTX)
Go RecoveValues ​​(CTX)
Selezionare
caso<-ctx.Done():
fmt.Println ("ha impiegato troppo tempo!")

tempo.Dormire (5 * volte.Secondo)

FunCaddValues ​​(contesto CTX.Contesto) contesto.Contesto
Contesto di restituzione.WithValue (ctx, "chiave", "valore")

FunCretrieveValues ​​(contesto CTX.Contesto)
per
Selezionare
caso<-ctx.Done():
fmt.Println ("timeout")
ritorno
predefinito:
Valore: = CTX.Valore ("chiave")
fmt.Println (valore)

tempo.Dormire (1 * tempo.Secondo)

In questo esempio, definiamo una funzione di annullamento utilizzando il contesto.Funzione contimeout. Possiamo quindi attivare manualmente la funzione di annulla.

Una volta raggiunto il valore di timeout, viene chiamata la funzione di annullamento ed esegue la logica specificata.

Nella nostra funzione di recupero del valore, recuperiamo continuamente il valore con la chiave specificata utilizzando il loop. Controlliamo anche se il canale fatto dal contesto principale è ancora vivo. Se il timeout non è stato superato, il contesto genitore sarà comunque aperto, ma una volta raggiunto il timeout, il contesto viene annullato.

Nel nostro esempio, la funzione verrà eseguita ogni 1 secondo prima che venga raggiunto il timeout. Un output di esempio è come mostrato:

valore
valore
valore
valore
valore
Ci è voluto troppo tempo!
Tempo scaduto

Conclusione

Questo è stato un tutorial breve e fondamentale che discuteva dei contesti e come usarli nei programmi Go Go. Puoi controllare la documentazione per esplorare di più sui contesti GO.