Ce face context.WithDeadline
context.WithDeadline(parinte, moment) este ca WithTimeout, dar primește momentul exact până la care operația are voie să ruleze, de exemplu „până la 23:59”. Când momentul trece, ctx.Err() devine context.DeadlineExceeded.
Dacă momentul a trecut deja, contextul este anulat imediat. Dacă părintele are un termen mai devreme, rămâne termenul părintelui. ctx.Deadline() returnează termenul efectiv, ca funcțiile apelate să poată decide dacă mai au timp pentru o operație lungă.
Parametri
| Parametru | Descriere |
|---|---|
parent |
Contextul părinte. |
d |
Momentul limită (time.Time). |
Ce returnează
Contextul cu termen limită și funcția cancel.
Exemple
Exemplul 1: Termen trecut și termen viitor
package main
import (
"context"
"fmt"
"time"
)
func main() {
trecut := time.Date(2020, 1, 1, 0, 0, 0, 0, time.UTC)
ctx, cancel := context.WithDeadline(context.Background(), trecut)
defer cancel()
fmt.Println("Termen în trecut, Err:", ctx.Err())
viitor := time.Date(2099, 12, 31, 23, 59, 0, 0, time.UTC)
ctx2, cancel2 := context.WithDeadline(context.Background(), viitor)
defer cancel2()
d, ok := ctx2.Deadline()
fmt.Println("Termen:", d.Format("02.01.2006 15:04"), ok, "- Err:", ctx2.Err())
}
Rezultat
Termen în trecut, Err: context deadline exceeded
Termen: 31.12.2099 23:59 true - Err: <nil>
Exemplul 2: Mai am timp pentru o operație lungă?
Funcția citește termenul cu Deadline() și refuză din start o operație care oricum nu ar încăpea.
package main
import (
"context"
"errors"
"fmt"
"time"
)
func genereazaRaport(ctx context.Context, durataEstimata time.Duration) error {
if termen, ok := ctx.Deadline(); ok && time.Until(termen) < durataEstimata {
return errors.New("nu e destul timp, raportul nu a fost pornit")
}
return nil
}
func main() {
termen := time.Now().Add(200 * time.Millisecond)
ctx, cancel := context.WithDeadline(context.Background(), termen)
defer cancel()
fmt.Println("Raport scurt (10ms):", genereazaRaport(ctx, 10*time.Millisecond))
fmt.Println("Raport lung (5s): ", genereazaRaport(ctx, 5*time.Second))
}
Rezultat
Raport scurt (10ms): <nil>
Raport lung (5s): nu e destul timp, raportul nu a fost pornit
Greșeli frecvente
- Construiești termenul în fusul orar greșit (ora 23:59 în UTC în loc de ora României). Momentul este absolut; construiește-l cu
time.Date(..., loc)în zona potrivită.
Comenzi înrudite
context.WithTimeout: Creează un context care se anulează singur după durata dată; limita de timp standard pentru cereri și interogări.context.WithTimeoutCause: Ca WithTimeout și WithDeadline, dar la expirare context.Cause(ctx) returnează eroarea ta, nu doar DeadlineExceeded.context.Context: Interfața care duce prin program semnalul de anulare, termenul limită și valori legate de o cerere (ctx).time.Time: Tipul care ține un moment în timp: dată, oră, nanosecunde și fusul orar. Se creează cu time.Date sau time.Now.