WithDeadline und WithValue
Absolute Deadlines und anfragebezogene Werte übergeben
WithDeadline und WithValue ist eine kostenlose Go Academy-Lektion auf CoddyKit. Dies ist Lektion 3 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Go Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
context.WithDeadline
WithDeadline erstellt einen Context, der zu einem absoluten Zeitpunkt abgebrochen wird. Wenn der übergeordnete Context bereits eine frühere Deadline hat, hat die Deadline des übergeordneten Contexts Vorrang.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout im Vergleich zu WithDeadline
WithTimeout(parent, d) entspricht WithDeadline(parent, time.Now().Add(d)). Verwenden Sie WithDeadline, wenn Sie einen absoluten Ablaufzeitpunkt haben, beispielsweise aus einem eingehenden RPC-Header.
Deadline auslesen
Lesen Sie die Deadline eines beliebigen Contexts mit ctx.Deadline() aus. Der boolesche Wert gibt an, ob eine Deadline vorhanden ist.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue fügt dem Context ein Schlüssel-Wert-Paar hinzu. Nachgelagerter Code ruft es mit ctx.Value(key) ab.
type ctxKey string
const userKey ctxKey = "user"
ctx := context.WithValue(parent, userKey, currentUser)
func getUser(ctx context.Context) *User {
u, _ := ctx.Value(userKey).(*User)
return u
}Schlüsselkonflikte verhindern
Verwenden Sie für Schlüssel einen nicht exportierten, paketspezifischen Typ, um Konflikte zwischen Paketen zu verhindern. Verwenden Sie niemals direkt eingebaute Typen wie string oder int als Context-Schlüssel.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)Was im Context gespeichert werden sollte
Speichern Sie nur requestbezogene Werte im Context, die API-Grenzen überschreiten: Trace-IDs, Authentifizierungstoken und Request-IDs. Speichern Sie keine optionalen Funktionsargumente oder veränderlichen Zustände.
WithValue-Performance
ctx.Value durchsucht die Context-Kette linear. Vermeiden Sie es, viele Werte pro Context zu speichern. Gruppieren Sie mehrere Werte stattdessen in einer einzigen Struktur.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Werte über Middleware weitergeben
HTTP-Middleware ist der übliche Ort, um Request-Metadaten an den Context anzuhängen und sie in Handlern abzurufen:
func Auth(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
user := authenticate(r)
ctx := context.WithValue(r.Context(), userKey, user)
next.ServeHTTP(w, r.WithContext(ctx))
})
}r.WithContext
Ersetzen Sie den Context einer HTTP-Anfrage mit r.WithContext(ctx). Dadurch wird eine flache Kopie der Anfrage mit dem neuen Context erstellt; das Original bleibt unverändert.
Deadlines weitergeben
Wenn ein Gateway eine Deadline im Context setzt und die Anfrage weitergibt, berücksichtigen alle nachgelagerten Services, die den Context akzeptieren, die Deadline automatisch, ohne dass eine explizite Timeout-Logik erforderlich ist.
Context-Kette
Jedes WithValue, WithCancel und WithTimeout verpackt den übergeordneten Context in einem neuen Knoten. ctx.Value durchläuft die Kette, bis es den Schlüssel findet oder einen Root-Context erreicht, der nil zurückgibt.
Kurzer Test
Warum sollten Context-Schlüssel nicht exportierte, paketspezifische Typen sein?
Zusammenfassung: WithDeadline und WithValue
Wichtige Punkte:
- WithDeadline bricht zu einem absoluten Zeitpunkt ab; WithTimeout verwendet eine relative Dauer
ctx.Deadline()liest die Deadline aus- WithValue ist für requestbezogene Metadaten vorgesehen; verwenden Sie typisierte, nicht exportierte Schlüssel
- Gruppieren Sie mehrere Werte in einer Struktur, um die Tiefe der Kette zu verringern
Häufig gestellte Fragen
Ist die Lektion „WithDeadline und WithValue“ kostenlos?
Ja — der vollständige Text von „WithDeadline und WithValue“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Go Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Go Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „WithDeadline und WithValue“?
Absolute Deadlines und anfragebezogene Werte übergeben Du übst Go Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um Go Academy zu starten?
Keine Vorkenntnisse erforderlich. Go Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 3 von 4.
Wie lange dauert die Lektion „WithDeadline und WithValue“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser Go Academy-Lektion Code schreiben und ausführen?
Ja. Jede Go Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum context.Context existiert
- WithCancel und WithTimeout
- WithDeadline und WithValue
- Context in HTTP- und Datenbankaufrufen