WithDeadline ve WithValue
Mutlak son tarihler ve istek kapsamındaki değerleri aktarma
WithDeadline ve WithValue, CoddyKit'te ücretsiz bir Go Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Go Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Go Academy kursu toplamda 4 dersten oluşur.
context.WithDeadline
WithDeadline, mutlak bir zamanda iptal edilen bir Context oluşturur. Üst Context'in daha erken bir son tarihi varsa üst Context'in son tarihi önceliklidir.
deadline := time.Now().Add(10 * time.Second)
ctx, cancel := context.WithDeadline(parent, deadline)
defer cancel()WithTimeout ve WithDeadline karşılaştırması
WithTimeout(parent, d), WithDeadline(parent, time.Now().Add(d)) ile eşdeğerdir. Mutlak bir sona erme zamanınız olduğunda (örneğin gelen bir RPC üst bilgisinden) WithDeadline kullanın.
Son tarihi okuma
Herhangi bir bağlamın son tarihini ctx.Deadline() ile inceleyin. Boolean değer, bir son tarihin mevcut olup olmadığını belirtir.
if deadline, ok := ctx.Deadline(); ok {
fmt.Println("expires at:", deadline)
}context.WithValue
WithValue, bağlama bir anahtar-değer çifti ekler. Alt düzey kod bu değeri ctx.Value(key) ile alır.
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
}Anahtar çakışmalarını önleme
Paketler arasındaki çakışmaları önlemek için dışa aktarılmamış, pakete özel bir türü anahtar olarak kullanın. Yerleşik türleri (string, int) doğrudan bağlam anahtarı olarak kesinlikle kullanmayın.
// Bad: string key can collide
ctx = context.WithValue(ctx, "user", u)
// Good: package-scoped type
type userKeyType struct{}
ctx = context.WithValue(ctx, userKeyType{}, u)Bağlamda ne saklanmalı
Yalnızca API sınırlarını aşan istek kapsamındaki değerleri saklayın: izleme kimlikleri, kimlik doğrulama belirteçleri ve istek kimlikleri. İsteğe bağlı işlev bağımsız değişkenlerini veya değiştirilebilir durumu saklamayın.
WithValue performansı
ctx.Value, bağlam zincirinde doğrusal bir arama gerçekleştirir. Her bağlamda çok sayıda değer saklamaktan kaçının; birden fazla değer için bunları tek bir yapı içinde gruplayın.
type RequestMeta struct {
UserID int
TraceID string
}
type metaKey struct{}
ctx = context.WithValue(ctx, metaKey{}, RequestMeta{...})Değerleri ara katman yazılımı üzerinden aktarma
HTTP ara katman yazılımı, istek üst verilerini bağlama eklemek ve bunları işleyicilerde almak için standart yerdir:
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
Bir HTTP isteğinin bağlamını r.WithContext(ctx) kullanarak değiştirin. Bu işlem, yeni bağlama sahip isteğin sığ bir kopyasını oluşturur ve özgün isteği değiştirmez.
Son tarihin aktarılması
Bir ağ geçidi bağlama bir son tarih ayarlayıp isteği alt hizmete ilettiğinde, bağlamı kabul eden tüm hizmetler açık bir zaman aşımı mantığına gerek kalmadan son tarihe otomatik olarak uyar.
Bağlam zinciri
Her WithValue, WithCancel ve WithTimeout, üst bağlamı yeni bir düğümle sarar. ctx.Value, anahtarı bulana veya nil döndüren bir kök bağlama ulaşana kadar zincirde ilerler.
Hızlı kontrol
Bağlam anahtarları neden dışa aktarılmamış, pakete özel türler olmalıdır?
Özet: WithDeadline ve WithValue
Temel noktalar:
- WithDeadline mutlak bir zamanda iptal eder; WithTimeout göreli bir zaman kullanır
- ctx.Deadline() son tarihi okur
- İstek kapsamındaki üst veriler için WithValue kullanın; türü belirlenmiş, dışa aktarılmamış anahtarlar kullanın
- Zincir derinliğini azaltmak için birden fazla değeri bir yapıda gruplayın
Sıkça Sorulan Sorular
“WithDeadline ve WithValue” dersi ücretsiz mi?
Evet — “WithDeadline ve WithValue” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Go Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Go Academy kursu toplamda 4 dersten oluşur.
“WithDeadline ve WithValue” dersinde ne öğreneceğim?
Mutlak son tarihler ve istek kapsamındaki değerleri aktarma Go Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Go Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Go Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“WithDeadline ve WithValue” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Go Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Go Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- context.Context Neden Var?
- WithCancel ve WithTimeout
- WithDeadline ve WithValue
- HTTP ve Veritabanı Çağrılarında Bağlam