Junior
Go'da kontekst nima?
sobes.tech AI
AIdan javob
Go'da (context.Context) kontekst, yakuniy muddat, bekor qilish signali va so'rovga xos ma'lumotlarni olib yuradigan ob'ekt. Bu, goroutine'larning hayot aylanishini boshqarish va ular orasida ma'lumot uzatish uchun ishlatiladi.
Asosiy xususiyatlar:
- Konkurrentlik uchun xavfsiz: U xavfsiz tarzda goroutine'lar orasida o'tkazilishi mumkin.
- O'zgarmas: Bir marta yaratilgach,
Contexto'zgartirilmaydi. Merosxo'r kontekstlar ota kontekst asosida yaratiladi. - Hierarxik: Kontekstlar daraxt shaklida bo'lib, (
context.Background()yokicontext.TODO()) bilan boshlanadi. Ota kontekstning bekor qilinishi, barcha bolalarining bekor qilinishiga olib keladi.
context paketining asosiy funksiyalari:
context.Background(): Bo'sh kontekst, odatda main-funksiyada, yuqori darajadagi so'rovlar yoki testlarda ishlatiladi. Hech qachon bekor qilinmaydi.context.TODO(): Shuningdek, bo'sh kontekst. Qachonki, qaysi kontekstni ishlatishni bilmasangiz yoki kontekst funksionalligi hali amalga oshirilmagan bo'lsa, foydalaniladi.context.WithCancel(parent Context): Yangi bolalar kontekstini va bekor qilish funksiyasini qaytaradi. Bu funksiyani chaqirish, bu kontekst va uning barcha bolalarini bekor qiladi.context.WithDeadline(parent Context, deadline time.Time): Belgilangan vaqtga yetganda avtomatik ravishda bekor qilinadigan bolalar kontekstini qaytaradi. Shuningdek, qo'lda bekor qilish uchun funksiyani ham qaytaradi.context.WithTimeout(parent Context, timeout time.Duration):WithDeadlinebilan bir xil, faqat davomiylik bilan.context.WithValue(parent Context, key, val interface{}): Kalitga asoslangan qiymat bilan bolalar kontekstini qaytaradi.
Qo'llanilishi:
- Amallarni bekor qilish: Masalan, HTTP so'rovining timeouti yoki uzoq davom etadigan operatsiyani to'xtatish.
- Ma'lumotlarni uzatish: Masalan, so'rov ID'si loglash uchun, autentifikatsiya ma'lumotlari.
context.WithTimeout dan foydalanish misoli:
package main
import (
"context"
"fmt"
"time"
)
func longRunningOperation(ctx context.Context, resultChan chan string) {
select {
case <-time.After(3 * time.Second):
// Operatsiya muvaffaqiyatli yakunlandi
resultChan <- "Operatsiya yakunlandi"
case <-ctx.Done():
// Kontekst bekor qilindi
err := ctx.Err() // Bekor qilish sababini olamiz
resultChan <- fmt.Sprintf("Operatsiya bekor qilindi: %v", err)
}
}
func main() {
// 2 sekundlik timeout bilan kontekst yaratamiz
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
defer cancel() // Bekor qilish funksiyasini chaqirishni ta'minlash
resultChan := make(chan string, 1)
go longRunningOperation(ctx, resultChan)
// Natija yoki bekor qilishni kutamiz
select {
case res := <-resultChan:
fmt.Println(res)
case <-ctx.Done():
fmt.Printf("Asosiy kontekst tugadi: %v\n", ctx.Err())
}
// Agar bekor qilinsa, goroutine tugashiga biroz kutamiz
time.Sleep(1 * time.Second)
}
Ushbu misolda, longRunningOperation kontekstning bekor qilinishini tekshiradi. Agar asosiy kontekstning timeouti (2 sekund) undan oldin (3 sekund) tugasa, goroutine ctx.Done() orqali bekor qilish signalini oladi va tugaydi.