Heim  >  Artikel  >  Backend-Entwicklung  >  So verstehen Sie das Kontextkonzept in der Go-Sprache

So verstehen Sie das Kontextkonzept in der Go-Sprache

PHPz
PHPzOriginal
2023-06-03 16:40:43646Durchsuche

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.

Übersicht

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.

Design ofContext

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{}
}
  • Deadline() gibt die mit dem Kontext verknüpfte Frist zurück. ok ist wahr, wenn die Frist existiert, andernfalls falsch. Wenn ok den Wert „false“ hat, wird der durch den Aufruf der Methode „Done()“ zurückgegebene Kanal für immer blockiert. Die Methode
  • Done() gibt einen Kanal zurück, der geschlossen wird, wenn die Context-Instanz ihre Arbeit abgeschlossen hat. Das bedeutet, dass Sie den Done()-Kanal regelmäßig überprüfen oder auf sein Abschlussereignis hören müssen, um festzustellen, ob der Kontext seine Arbeit abgeschlossen hat. Die Methode
  • Err() gibt den im Kontext gespeicherten Fehler zurück. Wenn kein Fehler vorliegt, wird Null zurückgegeben. Die Methode „Value(key)“ gibt den Wert zurück, der dem Schlüssel entspricht. Diese Methode ist sehr nützlich, da sie es uns ermöglicht, Kontextinformationen zwischen verschiedenen Goroutinen weiterzugeben.
  • Kontextverwendung in der Go-Standardbibliothek

In der Go-Standardbibliothek ist Kontext eine sehr häufig verwendete API. Beispielsweise kann im Paket net/http eine neue Context-Instanz über die http.Request-Instanz abgerufen werden. Dies geschieht, um auf Kontextinformationen in verschiedenen Goroutinen zuzugreifen und diese zu aktualisieren. Hier ist ein einfaches Beispiel:

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

Der Hauptvorteil von Context besteht darin, dass wir damit problemlos Kontextinformationen zwischen Goroutinen weitergeben können. Diese Fähigkeit ist sehr nützlich und kann in vielen verschiedenen Anwendungsszenarien eingesetzt werden. Nachfolgend sind einige gängige Anwendungsszenarien aufgeführt:

Kontext in HTTP-Servern verwenden

In HTTP-Servern kann Kontext verwendet werden, um Kontextinformationen zwischen Anforderungen und Antworten zu übergeben, z. B. Anforderungs-ID, Benutzeridentität, Protokollierung, Anforderungs-Timeout usw.

Kontext in der Datenbank oder im Cache verwenden

Beim Ausführen von Vorgängen in der Datenbank oder im Cache kann Kontext verwendet werden, um laufende Vorgänge abzubrechen. Beispielsweise kann es auf einem stark ausgelasteten Webserver erforderlich sein, eine Abfrageanforderung abzubrechen, wenn der Vorgang abläuft oder genügend Serverressourcen verfügbar sind.

Kontext für Überwachung und Metriken verwenden

Kontext kann für die Nachverfolgung bei Überwachung und Metriken verwendet werden. Sie können beispielsweise ein Tag wie „SELECT /

Trace_id=123

/ * 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

Context kann für die Ablaufverfolgung bei Debugging und Diagnose verwendet werden. Beispielsweise kann in einer bestimmten Fehlersituation ein Kontext verwendet werden, um wichtige Informationen zu speichern, die dabei helfen, das Problem zu finden und zu beheben.

Zusammenfassung

In diesem Artikel haben wir das Konzept des Kontexts in der Go-Sprache und seine Vorteile ausführlich besprochen. Wir haben das Design von Context und seine Verwendung in der Standardbibliothek eingeführt. Der Kontext ist bei der Multi-Coroutine-Programmierung und bei Microservices nützlich. Daher ist es von grundlegender Bedeutung, seine Verwendung und Details zu verstehen, um ein besserer Go-Entwickler zu werden.

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn