Middle
Rääkige mulle konteksti kasutamise juhtudest Go-s.
sobes.tech AI
Vastus AI-lt
Go kontekstit kasutatakse päringute elutsükli haldamiseks ja gorutiinide täitmise kontrollimiseks. Peamised kasutusjuhtumid:
- Tühistamine: võimaldab tühistada konkreetse päringuga seotud gorutiinide ahela. Näiteks ühenduse sulgemisel või ajapiirangu täitumisel.
- Aja piir: määrab operatsiooni täitmise lõppkuupäeva. Kui operatsioon ei lõpe õigeaegselt, tühistatakse kontekst. See takistab lõpmatut ootamist.
- Andmete edastamine: võimaldab edastada konkreetse päringuga seotud andmeid (näiteks kasutaja ID, jälgimise identifikaator) funktsioonide ahelas ilma nende signatuuride muutmiseta.
Kasutusnäited:
-
Tühistamine signaaliga:
pakett main import ( "context" "fmt" "time" ) funktsioon worker(ctx context.Context, id int) { valik { juhtum <-ctx.Done(): fmt.Printf("Tööline %d katkestati\n", id) tagasi vaik: fmt.Printf("Tööline %d töötab...\n", id) time.Sleep(500 * time.Millisecond) } } funktsioon main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Tagab tühistamise go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Tühistab konteksti time.Sleep(500 * time.Millisecond) // Annab aega gorutiinidele lõpetamiseks } -
Aja piir:
pakett main import ( "context" "fmt" "time" ) funktsioon longOperation(ctx context.Context) viga { valik { juhtum <-time.After(3 * time.Second): // Pikk töö imiteerimine fmt.Println("Operatsioon edukalt lõpetatud") tagasi nil juhtum <-ctx.Done(): fmt.Println("Operatsioon tühistati konteksti poolt:", ctx.Err()) tagasi ctx.Err() } } funktsioon main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() viga := longOperation(ctx) kui viga != nil { fmt.Println("Viga:", viga) } } -
Andmete edastamine:
pakett main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { kasutajaID := ctx.Value(userIDKey).(int) fmt.Printf("Päringu töötlemine kasutaja ID-ga: %d\n", kasutajaID) // Järgmine töötlemine kasutades kasutaja ID-d } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }