Middle
Pastāstiet man par konteksta lietošanas gadījumiem Go.
sobes.tech AI
Atbilde no AI
Go konteksts tiek izmantots pieprasījumu dzīves cikla pārvaldībai un gorutīnu izpildes kontrolei. Galvenie lietošanas gadījumi:
- Atcelšana: ļauj atcelt saistīto gorutīnu ķēdi ar konkrētu pieprasījumu. Piemēram, aizverot savienojumu vai pēc laika limita.
- Laika limits: nosaka operācijas izpildes galējo termiņu. Ja operācija nebeidzas laikā, konteksts tiek atcelts. Tas novērš bezgalīgu gaidīšanu.
- Datu nodošana: ļauj nodot ar konkrētu pieprasījumu saistītus datus (piemēram, lietotāja ID, trasēšanas identifikatoru) funkciju ķēdē bez to parakstu maiņas.
Lietošanas piemēri:
-
Atcelšana ar signālu:
pakotne main import ( "context" "fmt" "time" ) funkcija worker(ctx context.Context, id int) { izvēle { gadījums <-ctx.Done(): fmt.Printf("Darbinieks %d pārtraukts\n", id) atgriezties pārējais: fmt.Printf("Darbinieks %d strādā...\n", id) time.Sleep(500 * time.Millisecond) } } funkcija main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Garantēts atcelšana go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Atceļ kontekstu time.Sleep(500 * time.Millisecond) // Dod laiku gorutīnām pabeigt darbu } -
Laika limits:
pakotne main import ( "context" "fmt" "time" ) funkcija longOperation(ctx context.Context) kļūda { izvēle { gadījums <-time.After(3 * time.Second): // Ilga darba imitācija fmt.Println("Operācija veiksmīgi pabeigta") atgriezties nil gadījums <-ctx.Done(): fmt.Println("Operācija atcelta ar kontekstu:", ctx.Err()) atgriezties ctx.Err() } } funkcija main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() kļūda := longOperation(ctx) ja kļūda != nil { fmt.Println("Kļūda:", kļūda) } } -
Datu nodošana:
pakešu main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { lietošanasID := ctx.Value(userIDKey).(int) fmt.Printf("Pieprasījuma apstrāde lietotāja ID: %d\n", lietošanasID) // Turpmākā apstrāde ar lietotāja ID } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }