Kontext in Go bietet einen Mechanismus, um beliebige Werte zusammen mit Anfragen zu übergeben und Abbrüche zu verfolgen. Standardmäßig nutzen alle Kontexte denselben Löschmechanismus. In bestimmten Szenarien kann es jedoch erforderlich sein, die Kontextweitergabe vom Abbruch zu entkoppeln.
Stellen Sie sich einen HTTP-Handler vor, der Aufgaben über die Lebensdauer der Anforderung hinaus ausführt. Nach der Rückgabe einer Antwort kann der Handler eine asynchrone Aufgabe in einer Goroutine initiieren. Diese Aufgabe erfordert möglicherweise Zugriff auf Kontextwerte, darf jedoch nicht beendet werden, wenn der ursprüngliche Anforderungskontext abgebrochen wird.
WithoutCancel wurde in Go 1.21 eingeführt und bietet eine einfache Möglichkeit um nicht aufhebende Kontexte zu schaffen. Mit dieser Methode kann man eine Kopie des ursprünglichen Kontexts erhalten, die alle seine gespeicherten Werte enthält, aber unabhängig von seinem Abbruchstatus bleibt.
Vor Go 1.21, benutzerdefiniert Implementierungen von nicht aufhebenden Kontexten waren erforderlich. Der Schlüssel besteht darin, einen Typ zu erstellen, der die context.Context-Schnittstelle erfüllt und die folgenden Methoden überschreibt, um einen Abbruch zu verhindern:
Darüber hinaus muss die Implementierung den ursprünglichen Kontext speichern und Value()-Aufrufe delegieren, um die gespeicherten Werte abzurufen.
import ( "context" "github.com/mypackage/mycontext" ) func Handler(ctx context.Context) (interface{}, error) { result := doStuff(ctx) newContext := mycontext.WithoutCancel(ctx) go func() { doSomethingElse(newContext) }() return result }
Durch das Verständnis der Prinzipien hinter nicht aufhebenden Kontexten und die Nutzung der verfügbaren Tools können Entwickler benutzerdefinierte erstellen Lösungen oder nutzen Sie die integrierte Funktionalität von Go, um die gewünschte Kontextweitergabe ohne Abbruch zu erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich Kontexte in Go ohne Stornierungsweitergabe verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!