Middle
Povedzte mi o prípadoch použitia kontextu v Go.
sobes.tech AI
Odpoveď od AI
Kontext v Go sa používa na riadenie životného cyklu požiadaviek a kontrolu vykonávania gorútin. Hlavné prípady použitia:
- Zrušenie: Umožňuje zrušiť reťazec gorútin spojený s určitým požiadavkom. Napríklad pri zatvorení spojenia alebo po časovom limite.
- Časový limit: Nastavuje konečný termín vykonania operácie. Ak operácia nie je dokončená včas, kontext je zrušený. To zabraňuje nekonečnému čakanie.
- Prenos špecifických údajov požiadavky: Umožňuje prenášať údaje súvisiace s konkrétnou požiadavkou (napríklad ID používateľa, identifikátor trasovania) cez reťazec volaní funkcií bez zmeny ich podpisov.
Príklady použitia:
-
Zrušenie podľa signálu:
balík main import ( "context" "fmt" "time" ) funkcia worker(ctx context.Context, id int) { za { výber { prípad <-ctx.Done(): fmt.Printf("Pracovník %d prerušen\n", id) vrátenie default: fmt.Printf("Pracovník %d pracuje...\n", id) time.Sleep(500 * time.Millisecond) } } } funkcia main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Zaručíme zrušenie go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time Sekunda) cancel() // Zrušíme kontext time.Sleep(500 * time.Millisecond) // Dáme čas gorutinám dokončiť } -
Časový limit:
balík main import ( "context" "fmt" "time" ) funkcia longOperation(ctx context.Context) error { výber { prípad <-time.After(3 * time.Second): // Imitačná dlhá práca fmt.Println("Operácia úspešne dokončená") vrátenie nil prípad <-ctx.Done(): fmt.Println("Operácia zrušená kontextom:", ctx.Err()) vrátenie ctx.Err() } } funkcia main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() err := longOperation(ctx) akže ak err != nil { fmt.Println("Chyba:", err) } } -
Prenos údajov:
balík main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { userID := ctx.Value(userIDKey).(int) fmt.Printf("Spracovanie požiadavky pre používateľské ID: %d\n", userID) // Ďalšie spracovanie požiadavky s použitím userID } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }