CodeBlanks Logo Icon CodeBlanks

WithCancel

WithCancel ile iptal edilebilir context öğrenirsin.

WithCancel

context.WithCancel(ust) bir alt context ve bir cancel fonksiyonu döndürür. cancel() çağrılınca alt context ve ondan türeyen tüm context'ler iptal olur; üst etkilenmez.

ctx, cancel := context.WithCancel(context.Background())
defer cancel()  // kaynak sızmasın

go izle(ctx)
// ...
cancel()  // izle goroutine'i durur

cancel birden çok kez çağrılabilir; ilk çağrıdan sonrakiler etkisizdir.

İptali dinleyen goroutine

Uzun çalışan bir goroutine her döngü adımında iptali kontrol eder:

func izle(ctx context.Context) {
    for {
        select {
        case <-ctx.Done():
            fmt.Println("durdu:", ctx.Err())
            return
        case <-time.After(100 * time.Millisecond):
            fmt.Println("kontrol")
        }
    }
}

İptal işbirlikçidir: context goroutine'i zorla durdurmaz, goroutine sinyali kontrol edip kendisi çıkar.

Uygulama İptal et

WithCancel ile context oluştur. Bir goroutine <-ctx.Done() bekleyip ctx.Err()'i bir kanala göndersin. main cancel() çağırıp kanaldan gelen değeri yazdırsın.

Başlangıç kodu

main.go
package main

import (
    "context"
    "fmt"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "context"
    "fmt"
)

func main() {
    ctx, cancel := context.WithCancel(context.Background())
    defer cancel()
    sonuc := make(chan error)
    go func() {
        <-ctx.Done()
        sonuc <- ctx.Err()
    }()
    cancel()
    fmt.Println(<-sonuc)
}

Beklenen çıktı

context canceled

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 <code>cancel</code> hiç çağrılmazsa ne olur?

  • Context otomatik iptal olur
  • Context ve bağlı kaynaklar üst iptal edilene kadar bellekte kalır Doğru cevap
  • Hiçbir şey
  • Program çöker

Açıklama: go vet bu yüzden "cancel fonksiyonu kullanılmadı" uyarısı verir; defer cancel() alışkanlık olmalıdır.

2 Kaynağı bırak

Soru
ctx, cancel := context.WithCancel(ctx)
____ cancel()
Cevap
ctx, cancel := context.WithCancel(ctx)
defer cancel()

Açıklama: defer cancel() fonksiyon bitince context'e bağlı kaynakları serbest bırakır.

3 İptal zinciri

Kavram Anlamı
cancel() Alt context'leri iptal eder
Üst context Etkilenmez
ctx.Err() context.Canceled
select + Done İptali dinler

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