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:
Funksiya context qabul qilsa, uni birinchi parametr sifatida uzatish odatiy:
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:
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:
Deadline esa aniq vaqtni belgilaydi:
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
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.