WithValue
- Go kursu
- Orta seviye
- Ders 32/80
- 4 dk
WithValue ile context içinde değer taşımayı öğrenirsin.
WithValue
context.WithValue(ust, anahtar, deger) istek kapsamlı veriyi (istek kimliği, kullanıcı, trace bilgisi) taşır. Anahtar, başka paketlerle çakışmasın diye dışa aktarılmamış özel bir tür olmalıdır:
type anahtar int
const userKey anahtar = 0
ctx = context.WithValue(ctx, userKey, "ada")
ad, ok := ctx.Value(userKey).(string)Tür güvenli yardımcılar
Anahtarı paket içinde gizleyip yalnızca yardımcı fonksiyonları dışa aktarmak yaygın bir desendir:
func WithUser(ctx context.Context, ad string) context.Context {
return context.WithValue(ctx, userKey, ad)
}
func User(ctx context.Context) (string, bool) {
ad, ok := ctx.Value(userKey).(string)
return ad, ok
}Böylece çağıranlar tür iddiasıyla uğraşmaz ve anahtar dışarıdan değiştirilemez.
Uygulama Kullanıcı taşı
type ctxKey struct{} tanımla. WithUser ve User yardımcılarını yaz. "ada" kullanıcısını ekleyip okuyarak değeri ve ok'u yazdır.
Başlangıç kodu
package main
import (
"context"
"fmt"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"context"
"fmt"
)
type ctxKey struct{}
func WithUser(ctx context.Context, ad string) context.Context {
return context.WithValue(ctx, ctxKey{}, ad)
}
func User(ctx context.Context) (string, bool) {
ad, ok := ctx.Value(ctxKey{}).(string)
return ad, ok
}
func main() {
ctx := WithUser(context.Background(), "ada")
fmt.Println(User(ctx))
}Beklenen çıktı
ada true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 WithValue için hangisi <strong>uygun değildir</strong>?
- İstek kimliği
- Kimliği doğrulanmış kullanıcı
- Trace bilgisi
- Fonksiyonun zorunlu parametreleri (ör. veritabanı bağlantısı) Doğru cevap
Açıklama: Zorunlu bağımlılıklar açık parametre olarak verilmelidir; context'e gizlemek kodu anlaşılmaz ve tür güvensiz yapar.
2 Değeri oku
id, ok := ctx.____(istekKey).(string)
id, ok := ctx.Value(istekKey).(string)
Açıklama: ctx.Value anahtara karşılık gelen değeri any olarak döndürür; tür iddiasıyla çevrilir.
3 Kullanım
| Kavram | Anlamı |
|---|---|
İstek kimliği |
WithValue uygun |
Veritabanı bağlantısı |
Açık parametre |
Özel anahtar türü |
Çakışmayı önler |
Yardımcı fonksiyon |
Tür güvenli erişim |