Middle
Papaskinkite apie konteksto naudojimo atvejus Go.
sobes.tech AI
Atsakymas iš AI
„Go“ kontekstas naudojamas užklausų gyvavimo ciklo valdymui ir gorutinių vykdymo kontrolei. Pagrindiniai naudojimo atvejai:
- Atšaukimas: leidžia atšaukti susijusią gorutinių grandinę su tam tikru užklausa. Pavyzdžiui, uždarius ryšį arba pasibaigus laikui.
- Laiko limitas: nustato operacijos vykdymo galutinį terminą. Jei operacija nebaigiama laiku, kontekstas atšaukiamas. Tai užkerta kelią begaliniam laukimui.
- Duomenų perdavimas: leidžia perduoti su konkrečia užklausa susijusius duomenis (pavyzdžiui, naudotojo ID, sekimo žymeklį) funkcijų grandinėje be jų parašų keitimo.
Naudojimo pavyzdžiai:
-
Atšaukimas signalu:
paket main import ( "context" "fmt" "time" ) funkcija worker(ctx context.Context, id int) { įvairovė { pasirinkimas { atvejis <-ctx.Done(): fmt.Printf("Darbininkas %d nutrauktas\n", id) grįžti numatyta: fmt.Printf("Darbininkas %d dirba...\n", id) time.Sleep(500 * time.Millisecond) } } } funkcija main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Garantuoja atšaukimą go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Atšaukia kontekstą time.Sleep(500 * time.Millisecond) // Duoda laiko gorutinėms užbaigti } -
Laiko limitas:
paket main import ( "context" "fmt" "time" ) funkcija longOperation(ctx context.Context) klaida { įvairovė { atsitiktinis <-time.After(3 * time.Second): // Ilgo darbo imitacija fmt.Println("Operacija sėkmingai baigta") grįžti nil atsitiktinis <-ctx.Done(): fmt.Println("Operacija atšaukta konteksto:", ctx.Err()) grįžti ctx.Err() } } funkcija main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() klaida := longOperation(ctx) jei klaida != nil { fmt.Println("Klaida:", klaida) } } -
Duomenų perdavimas:
pakuotė main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { naudotojoID := ctx.Value(userIDKey).(int) fmt.Printf("Užklausos apdorojimas naudotojo ID: %d\n", naudotojoID) // Tolimesnė užklausos apdorojimas naudojant naudotojo ID } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }