Il contesto è una delle funzionalità critiche di Go che abilita la concorrenza. In Go, "contesto" si riferisce a un pacchetto che fornisce funzionalità per valori con ambito di richiesta e segnali di annullamento oltre i limiti dell'API.
Il pacchetto di contesto funziona simultaneamente con il modello di concorrenza di Go, basato sul concetto di goroutine. Le goroutine sono thread di esecuzione leggeri che puoi creare e gestire in modo efficiente, semplificando la creazione di programmi simultanei in Go.
Il pacchetto di contesto
Il pacchetto di contesto fornisce funzionalità per l'annullamento di funzioni a esecuzione prolungata o di intere catene di chiamate. Il pacchetto aiuta anche a memorizzare i valori con ambito di richiesta per l'accesso ovunque all'interno della catena di chiamate. Questa funzione è utile quando si lavora con
API o microservizi, in cui le richieste possono estendersi su più chiamate di funzione e si desidera annullarle o allegare valori specifici.Ecco come puoi importare il pacchetto di contesto nel tuo file Vai ai programmi.
importare"contesto"
Le funzioni di contesto accettano il file Contesto struct tipo del pacchetto di contesto. Convenzionalmente, dovresti usare ctx come nome della variabile di istanza.
funzoperazioni(ctx contesto. Contesto) {
}
Le funzioni possono restituire il tipo struct Context per altre funzioni e operazioni.
funzoperazioni(ctx contesto. Contesto)contesto.Contesto {
}
Puoi creare un nuovo contesto con il file FARE funzione del pacchetto di contesto. La funzione TODO crea un nuovo contesto con il valore di contesto. Fatto(), un canale che verrà chiuso all'annullamento del contesto. Dovresti usarlo come segnaposto quando hai bisogno di un contesto ma nessun contesto genitore è adatto.
importare"contesto"
funzprincipale() {
ctx := contesto. FARE()
}
In alternativa, il Sfondo La funzione crea un nuovo contesto senza valore e un canale Done vuoto.
ctx := contesto. Sfondo()
Dovresti usare la funzione Background come radice di un albero di contesto.
Contesto Con Valori
Il pacchetto di contesto fornisce funzionalità per la propagazione di valori e segnali di annullamento. È possibile utilizzare i valori per le informazioni dai dati con ambito di richiesta ai segnali di annullamento e alle scadenze.
Il pacchetto di contesto consente anche la creazione di contesti figlio ereditati da contesti padre, consentendo un'efficiente gestione di valori e segnali di cancellazione in tutto un programma poiché è possibile passare il contesto attraverso più funzioni.
Ecco un esempio di come passare il contesto attraverso le funzioni con il pacchetto context.
importare (
"contesto"
)funzpreziosoContesto(ctx contesto. Contesto)contesto.Contesto {
ritorno contesto. ConValore (ctx, "pass-key", "hfouneqcelkwfu")
}
funzricevereContestoDati(ctx contesto. Contesto)Qualunque {
passKey := ctx. Valore("pass-key")
ritorno passKey
}
IL preziosoContesto La funzione accetta un'istanza di contesto e restituisce un'istanza di contesto per la funzione seguente. L'istanza di contesto è un valore creato con il ConValore metodo. Il metodo WithValue accetta l'istanza del contesto dalla funzione e una coppia chiave-valore.
Per recuperare i dati dal contesto, dovrai creare un nuovo contesto con il file FARE O Sfondo function e passa il contesto alla funzione (in questo caso, validContext) e ricevi il contesto con the ricevereContestoDati funzione.
funzprincipale() {
ctx := contesto. Sfondo()
ctx = preziosoContesto (ctx)
fmt. Println (receiveContextData (ctx))
}
La variabile ctx è l'istanza di contesto della funzione Background. La funzione validContext accetta la variabile ctx e restituisce il contesto con un valore che la funzione receiveContextData accetta e restituisce il valore dalla coppia chiave-valore.
Contesto Timeout e scadenze
IL contesto Il pacchetto fornisce funzionalità per l'impostazione di timeout e scadenze nelle operazioni. L'impostazione di timeout e scadenze è utile per le operazioni che devono recuperare il ritardo.
I timeout sono la durata del tempo impiegato da un'operazione. È possibile impostare un timeout affinché un'operazione duri 4 secondi; successivamente, il contesto annulla la richiesta.
D'altra parte, una scadenza definisce il punto assoluto in cui un'operazione deve essere annullata.
Puoi usare il ConTimeout metodo per impostare un timeout di contesto. Ecco come puoi impostare un timeout di 2 secondi.
funzprincipale() {
ctx, cancel := contesto. WithTimeout (contesto. Sfondo(), 2 * tempo. Secondo)
differire Annulla()
// qualche operazione
}
IL principale La funzione crea un contesto con un timeout di due secondi. La funzione WithTimeout restituisce una funzione di annullamento che è possibile rinviare per l'annullamento all'uscita della funzione principale.
Puoi dichiarare le scadenze con il Con scadenza metodo. Il metodo WithDeadline accetta un'istanza di contesto e un'ora di scadenza.
funzfare qualcosa(ctx contesto. Contesto) {
scadenzaTempo := tempo. Adesso().Aggiungi(1500 * tempo. millisecondo)
ctx, ctxCancel := contesto. WithDeadline (ctx, scadenzaTempo)
differire ctxAnnulla()// qualche operazione
ctxAnnulla()
}
IL fare qualcosa funzione prende in un contesto, e il scadenzaTempo variabile è il tempo prima del contesto scadenza. IL ctx variabile è il contesto con una scadenza.
IL ctxAnnulla La variabile annulla il contesto quando il contesto supera la sua scadenza.
Best practice per l'utilizzo dei contesti in Go
Evita di usare i contesti come variabili globali. L'uso dei contesti come variabili globali può portare a comportamenti del codice imprevisti ed errori difficili da tracciare e utilizzare il contesto con parsimonia per ridurre la complessità del codice.
Infine, usa i contesti come segnali, non come garanzie. L'annullamento di un contesto non garantisce che tutte le goroutine smettano di funzionare; è solo un segnale e le goroutine sono agnostiche dei contesti.