Middle
Go-da kontekstin istifadə halları haqqında danış.
sobes.tech Süni İntellekt
AI-dan cavab
Go-da kontekst sorğuların həyat dövrünü idarə etmək və goroutine-lərin icrasını nəzarət etmək üçün istifadə olunur. Əsas istifadə halları:
- İptal: Müəyyən bir sorğu ilə əlaqəli goroutine zəncirini ləğv etməyə imkan verir. Məsələn, əlaqəni bağlama və ya zaman aşımı zamanı.
- Zaman aşımı: Əməliyyatın tamamlanması üçün son tarix təyin edir. Əgər əməliyyat bu müddətdə tamamlanmazsa, kontekst ləğv edilir. Bu, sonsuz gözləmələri qarşısını alır.
- Sorğu-özəl məlumatların ötürülməsi: Müəyyən bir sorğu ilə əlaqəli məlumatları (məsələn, istifadəçi ID-si, izləmə identifikatoru) çağrı zənciri vasitəsilə, onların imzalarını dəyişmədən ötürməyə imkan verir.
İstifadə nümunələri:
-
Siqnal ilə ləğv:
package main import ( "context" "fmt" "time" ) func worker(ctx context.Context, id int) { for { select { case <-ctx.Done(): fmt.Printf("İşçi %d dayandırıldı\n", id) return default: fmt.Printf("İşçi %d işləyir...\n", id) time.Sleep(500 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // İstənilən zaman ləğv etməyə zəmanət verir go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Konteksti ləğv edir time.Sleep(500 * time.Millisecond) // Goroutine-lərin bitməsinə vaxt verir } -
Zaman aşımı:
package main import ( "context" "fmt" "time" ) func longOperation(ctx context.Context) error { select { case <-time.After(3 * time.Second): // Uzun əməliyyatın simulyasiyası fmt.Println("Əməliyyat uğurla tamamlandı") return nil case <-ctx.Done(): fmt.Println("Əməliyyat kontekst tərəfindən ləğv edildi:", 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("Xəta:", err) } } -
Məlumatların ötürülməsi:
package main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { userID := ctx.Value(userIDKey).(int) fmt.Printf("İstək işlənir, istifadəçi ID-si: %d\n", userID) // İstəkə əlavə işləmə } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }
Əhəmiyyətlidir ki, context.Background() və ya context.TODO() əsas kontekst kimi istifadə olunsun və onu çağrı zəncirində aşağıya ötürəsiniz. Konteksti məlumat strukturlarında saxlamaq tövsiyə edilmir, əgər bu strukturun həyat dövrü ilə birbaşa əlaqəli deyilsə.