Middle
Go'da kontekstdan foydalanish holatlari haqida gapirib bering.
sobes.tech AI
AIdan javob
Go'da kontekst so'rovlarning hayot aylanishini boshqarish va gorutinlarning bajarilishini nazorat qilish uchun ishlatiladi. Asosiy foydalanish holatlari:
- Bekor qilish: Muayyan so'rov bilan bog'langan gorutinlar zanjirini bekor qilish imkonini beradi. Masalan, ulanishni yopish yoki timeout bo'lsa.
- Timeout: Amalni bajarish uchun oxirgi muddatni belgilaydi. Agar operatsiya bu muddat ichida tugamasa, kontekst bekor qilinadi. Bu cheksiz kutishni oldini oladi.
- So'rovga xos ma'lumotlarni uzatish: Muayyan so'rov bilan bog'liq ma'lumotlarni (masalan, foydalanuvchi ID, izlash identifikatori) chaqirish zanjiri orqali, ularning imzolarini o'zgartirmasdan uzatishga imkon beradi.
Foydalanish misollari:
-
Signal bilan bekor qilish:
package main import ( "context" "fmt" "time" ) func worker(ctx context.Context, id int) { for { select { case <-ctx.Done(): fmt.Printf("Ishchi %d to'xtatildi\n", id) return default: fmt.Printf("Ishchi %d ishlamoqda...\n", id) time.Sleep(500 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Bekor qilishni kafolatlaydi go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Kontekstni bekor qilish time.Sleep(500 * time.Millisecond) // Gorutinlar tugashiga vaqt berish } -
Timeout:
package main import ( "context" "fmt" "time" ) func longOperation(ctx context.Context) error { select { case <-time.After(3 * time.Second): // Uzun ishni simulyatsiya qilish fmt.Println("Operatsiya muvaffaqiyatli yakunlandi") return nil case <-ctx.Done(): fmt.Println("Operatsiya kontekst tomonidan bekor qilindi:", ctx.Err()) return ctx.Err() } } func main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() err := longOperation(ctx) if err != nil { fmt.Println("Xato:", err) } } -
Ma'lumotlarni uzatish:
package main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { userID := ctx.Value(userIDKey).(int) fmt.Printf("Foydalanuvchi ID uchun so'rovni qayta ishlash: %d\n", userID) // So'rovni davom ettirish userID bilan } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }
Kontekstni ildiz sifatida context.Background() yoki context.TODO() dan foydalanish va uni chaqirish zanjiri bo'ylab uzatish muhimdir. Kontekstni ma'lumotlar tuzilmalarida saqlash tavsiya etilmaydi, agar u to'g'ridan-to'g'ri bu tuzilmaning hayot aylanishi bilan bog'liq bo'lmasa.