WithDeadline
- Go kursu
- Orta seviye
- Ders 33/80
- 4 dk
WithDeadline ile belirli bir zamana bağlı context öğrenirsin.
WithDeadline
WithTimeout göreli süre alırken WithDeadline mutlak bir time.Time alır. Aslında WithTimeout(ctx, d), WithDeadline(ctx, time.Now().Add(d))'nin kısaltmasıdır.
son := time.Date(2026, 12, 31, 23, 59, 0, 0, time.UTC)
ctx, cancel := context.WithDeadline(context.Background(), son)
defer cancel()
if d, ok := ctx.Deadline(); ok {
fmt.Println("kalan:", time.Until(d))
}Son tarihi iletmek
ctx.Deadline() ile kalan süre okunup alt sistemlere uyarlanabilir. Örneğin gRPC ve birçok veritabanı sürücüsü ctx'teki son tarihi sunucuya iletir; böylece istemci vazgeçtiğinde sunucu da boşuna çalışmaz. Kalan süre çok kısaysa pahalı bir işe hiç başlamamak da iyi bir optimizasyondur.
Uygulama Geçmiş son tarih
context.WithDeadline'a time.Now().Add(-time.Second) ver. defer cancel() yaz ve ctx.Err() değerini yazdır.
Başlangıç kodu
package main
import (
"context"
"fmt"
"time"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"context"
"fmt"
"time"
)
func main() {
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(-time.Second))
defer cancel()
fmt.Println(ctx.Err())
}Beklenen çıktı
context deadline exceeded
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Geçmişte kalan bir tarihle <code>WithDeadline</code> çağrılırsa ne olur?
- Hiç iptal edilmez
- Bir gün sonra iptal olur
- Context hemen iptal edilmiş olarak döner Doğru cevap
- Panic üretir
Açıklama: Son tarih geçmişse context zaten DeadlineExceeded durumundadır; Done kanalı kapalıdır.
2 Son tarihi oku
if d, ok := ctx.____(); ok {
fmt.Println(time.Until(d))
}
if d, ok := ctx.Deadline(); ok {
fmt.Println(time.Until(d))
}
Açıklama: Deadline son tarihi ve bir son tarih ayarlanıp ayarlanmadığını döndürür.
3 Fonksiyon ve argüman
| Kavram | Anlamı |
|---|---|
WithTimeout |
Göreli süre |
WithDeadline |
Mutlak zaman |
ctx.Deadline() |
Son tarih ve ok |
time.Until(d) |
Kalan süre |