Angesichts der Beliebtheit der gleichzeitigen Programmierung ist ein wichtiges Thema die Übergabe gemeinsamer Variablen zwischen mehreren Goroutinen, z. B. Anforderungs-ID, Benutzeridentität, Protokollausgabe usw. Die Standardbibliothek der Go-Sprache bietet ein Paket namens „Context“, um dieses Problem zu lösen. Der Kontext ist in der Go-Sprache sehr wichtig, daher wird dieses Konzept in diesem Artikel ausführlich erläutert.
In der Go-Sprache kann Kontext als ein Objekt betrachtet werden, das Kontextinformationen zwischenspeichert, die während des gesamten Lebenszyklus der Anforderung ausgeführt werden, um auf gemeinsam genutzte Variablen in verschiedenen Goroutinen zuzugreifen und diese zu aktualisieren. Der Kontext wird als Parameter an verschiedene Funktionen im Programm und zwischen ihm und den direkt oder indirekt aufgerufenen Funktionen übergeben.
Context wurde entwickelt, um Kontextinformationen zwischen Goroutinen auszutauschen, und kann einfach mit context.Background() erstellt werden. Die Kontextschnittstelle besteht aus den folgenden zwei Methoden: Die Methode
type Context interface { Deadline() (deadline time.Time, ok bool) Done() <-chan struct{} Err() error Value(key interface{}) interface{} }
package main import ( "context" "fmt" "net/http" ) func main() { http.HandleFunc("/hello", helloHandler) http.ListenAndServe(":8080", nil) } func helloHandler(w http.ResponseWriter, r *http.Request) { ctx := r.Context() fmt.Fprintf(w, "Hello, %s!", ctx.Value("name")) }
Im obigen Beispiel erhalten wir eine Context-Instanz von der Request-Instanz und verwenden die Value()-Methode, um ein Schlüssel-Wert-Paar mit dem Namen „name“ zu erhalten. Dieses Schlüssel-Wert-Paar kann während der gesamten Lebensdauer der Anfrage weitergegeben werden, sodass wir es in verschiedenen Goroutinen verwenden können, um darauf zuzugreifen und es zu aktualisieren.
Neben der Verwendung von Context in HTTP-Servern kann es auch anderswo verwendet werden. Wenn Sie beispielsweise Vorgänge in einer Datenbank oder einem Cache ausführen, möchten Sie möglicherweise einen Kontext verwenden, um diese Vorgänge zu verfolgen. Dadurch wird sichergestellt, dass jede Goroutine diese Vorgänge bei Bedarf abbrechen kann.
func main() { ctx := context.Background() ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond) defer cancel() err := db.QueryContext(ctx, "SELECT * FROM users") if err != nil { log.Error(err) } }
Im obigen Beispiel verwenden wir die WithTimeout()-Methode, um eine neue Context-Instanz zu erstellen, die nach 100 Millisekunden abläuft. Wir können diese Kontextinstanz an den Datenbankabfragevorgang übergeben, um sicherzustellen, dass er bei Zeitüberschreitung abgebrochen wird.
Der Hauptvorteil von Context
Kontext in HTTP-Servern verwenden
Kontext in der Datenbank oder im Cache verwenden
Kontext für Überwachung und Metriken verwenden
/ * FROM mytable“ zu Ihrer SQL-Abfrage hinzufügen, um die Quelle der Abfrage zur Visualisierung in einem Abfrageverfolgungstool zu verfolgen. Context für Debugging und Diagnose verwenden
Zusammenfassung
Das obige ist der detaillierte Inhalt vonSo verstehen Sie das Kontextkonzept in der Go-Sprache. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!