In Go enthält ein Kontext ausführungsbezogene Informationen wie Fristen und Abbruchtokens. In bestimmten Szenarien kann es jedoch erforderlich sein, einen separaten Kontext zu erstellen, der dieselben Daten teilt, aber von der Löschung des ursprünglichen Kontexts nicht betroffen ist.
Die vorliegende Aufgabe besteht darin, einen „Klon“ zu erstellen " (oder Kopie) eines Go-Kontext-CTX, sodass:
Da context.Context eine Schnittstelle ist, können Sie Ihre eigene Implementierung definieren, die ignoriert Aufhebungssignale. Hier ist ein Beispiel:
package main import ( "context" "time" ) type noCancel struct { ctx context.Context } func (c noCancel) Deadline() (time.Time, bool) { return time.Time{}, false } func (c noCancel) Done() <-chan struct{} { return nil } func (c noCancel) Err() error { return nil } func (c noCancel) Value(key interface{}) interface{} { return c.ctx.Value(key) } // WithoutCancel returns a context that is never canceled. func WithoutCancel(ctx context.Context) context.Context { return noCancel{ctx: ctx} } func main() { ctx := context.Background() clone := WithoutCancel(ctx) // Create a goroutine using the clone context. go func() { // This goroutine will never be interrupted by cancelations on `ctx`. time.Sleep(time.Second) }() }
Sie können die WithoutCancel-Funktion verwenden, um einen Klonkontext innerhalb einer beliebigen Funktion oder Methode zu erstellen:
func f(ctx context.Context) { // Create a non-cancelable clone. clone := WithoutCancel(ctx) // Start an async task using the clone context. go func() { // This goroutine will not be affected by cancellations on `ctx`. }() }
Diese Lösung bietet eine einfache Möglichkeit, einen Kontext zu erstellen, der niemals abgebrochen wird, sodass Sie asynchrone Aufgaben ausführen können, die den ursprünglichen Kontext überdauern. Dies ist besonders nützlich, wenn Sie eine vorzeitige Beendigung von Hintergrundaufgaben aufgrund eines Kontextabbruchs vermeiden möchten.
Das obige ist der detaillierte Inhalt vonWie erstelle ich in Go einen Kontext, der die Stornierung ignoriert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!