CodeBlanks Logo Icon CodeBlanks

WithValue

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

main.go
package main

import (
    "context"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
id, ok := ctx.____(istekKey).(string)
Cevap
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

Orta seviye bölümündeki tüm dersler