Tarkibga o'tish

context asoslari

context.Context uzoq davom etadigan ishga bekor qilish signali, deadline va so‘rovga tegishli kichik qiymatlarni uzatadi. U HTTP so‘rovi, database amali va goroutine ishini chaqiruvchi endi kutmayotganida to‘xtatishga yordam beradi.

Boshlang‘ich context

context.Background() odatda main, test yoki serverning yuqori qatlamida ildiz context sifatida ishlatiladi. context.TODO() esa qaysi context uzatilishi hali aniqlanmagan vaqtinchalik joyni bildiradi:

ctx := context.Background()

Funksiya context qabul qilsa, uni birinchi parametr sifatida uzatish odatiy:

func LoadUser(ctx context.Context, id int64) error

Contextni struct ichida saqlamang va nil bermang. Chaqiruv uchun mos context bo‘lmasa, context.Background() ishlating.

Bekor qilish

context.WithCancel() ota contextdan bekor qilinadigan bola context yaratadi:

ctx, cancel := context.WithCancel(context.Background())
defer cancel()

cancel() chaqirilganda ctx.Done() kanali yopiladi. Context kuzatayotgan funksiya buni select orqali qabul qiladi, ctx.Err() esa sababni context.Canceled sifatida qaytaradi.

Timeout va deadline

Timeout joriy vaqtdan boshlab davomiylik belgilaydi:

ctx, cancel := context.WithTimeout(parent, 2*time.Second)
defer cancel()

Deadline esa aniq vaqtni belgilaydi:

ctx, cancel := context.WithDeadline(parent, time.Now().Add(2*time.Second))
defer cancel()

Vaqt tugaganda Done() yopiladi va ctx.Err() context.DeadlineExceeded qaytaradi. Ish deadline’dan oldin tugasa ham cancel()ni chaqiring: u timer va context bilan bog‘liq resurslarni tezroq bo‘shatadi.

Bekor qilinadigan ishchi funksiya

main.go
package main

import (
    "context"
    "fmt"
    "time"
)

func work(ctx context.Context) error {
    ticker := time.NewTicker(100 * time.Millisecond)
    defer ticker.Stop()

    for step := 1; step <= 10; step++ {
        select {
        case <-ctx.Done():
            return ctx.Err()
        case <-ticker.C:
            fmt.Println("Qadam:", step)
        }
    }
    return nil
}

func main() {
    ctx, cancel := context.WithTimeout(context.Background(), 250*time.Millisecond)
    defer cancel()

    if err := work(ctx); err != nil {
        fmt.Println("Ish tugadi:", err)
    }
}

work() har bir qadamda timer va bekor qilish signalini birga kutadi. Timeout tugagach, u keyingi qadamlarni bajarmasdan ctx.Err()ni qaytaradi.

WithValue() qachon ishlatiladi?

context.WithValue() request ID yoki autentifikatsiya ma’lumoti kabi jarayon chegaralaridan o‘tadigan, so‘rovga tegishli metadata uchun mo‘ljallangan. Oddiy funksiya parametri, konfiguratsiya yoki majburiy dependency o‘rnida ishlatmang.

Kalitlar to‘qnashmasligi uchun package ichida alohida, eksport qilinmagan tur ishlatiladi. Qiymat mavjudligiga ko‘r-ko‘rona tayanmang; type assertion natijasini tekshiring.

Xulosa

Context chaqiruv zanjiri bo‘ylab bekor qilish va vaqt chegarasini uzatadi. Uni birinchi parametr sifatida bering, nil ishlatmang va yaratilgan cancel() funksiyasini chaqiring. Ishchi funksiya ctx.Done()ni kuzatib, ctx.Err() bilan tugash sababini qaytarishi kerak.