Middle
Պատմեք ինձ կոնտեքստի օգտագործման դեպքերի մասին Go-ում։
sobes.tech AI
Պատասխան AI-ից
Go- ում կոնտեքստը օգտագործվում է հարցումների կյանքի ցիկլը կառավարելու և goroutine-ների կատարման վերահսկման համար: Հիմնական կիրառման դեպքերը՝
- Չեղարկում: Позволяет отменить цепочку goroutine-ների, կապված որոշակի հարցման հետ: Օրինակ՝ կապը փակելիս կամ ժամանակային սահմանափակման դեպքում:
- Ժամկետային սահմանափակում: Կարգավորում է գործողության կատարման վերջնաժամկետը: Եթե գործողությունը չի ավարտվում ժամանակին, կոնտեքստը չեղարկվում է:
- Հատուկ տվյալների փոխանցում: Позволяет передавать данные, связанные с конкретным запросом (например, ID пользователя, трассировки), առանց փոփոխելու ֆունկցիաների ստորագրությունները:
Օգտագործման օրինակներ՝
-
Չեղարկում սիգնալով:
package main import ( "context" "fmt" "time" ) func worker(ctx context.Context, id int) { for { select { case <-ctx.Done(): fmt.Printf("Աշխատող %d ընդհատվեց\n", id) return default: fmt.Printf("Աշխատող %d աշխատում է...\n", id) time.Sleep(500 * time.Millisecond) } } } func main() { ctx, cancel := context.WithCancel(context.Background()) defer cancel() // Համոզված ենք չեղարկման մասին go worker(ctx, 1) go worker(ctx, 2) time.Sleep(2 * time.Second) cancel() // Չեղարկում է կոնտեքստը time.Sleep(500 * time.Millisecond) // Տալիս ենք ժամանակ goroutine-ներին ավարտելու համար } -
Ժամկետային սահմանափակում:
package main import ( "context" "fmt" "time" ) func longOperation(ctx context.Context) error { switch { case <-time.After(3 * time.Second): // Դիտարկում երկար աշխատանք fmt.Println("Գործողությունը հաջողությամբ ավարտվեց") return nil case <-ctx.Done(): fmt.Println("Գործողությունը չեղարկվեց կոնտեքստով:", 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("Սխալ:", err) } } -
Տվյալների փոխանցում:
package main import ( "context" "fmt" ) type UserKey string const userIDKey UserKey = "userID" func processRequest(ctx context.Context) { userID := ctx.Value(userIDKey).(int) fmt.Printf("Հարցման մշակումը օգտվողի ID: %d\n", userID) // Հաջորդ մշակումը՝ օգտագործելով userID } func main() { ctx := context.WithValue(context.Background(), userIDKey, 123) processRequest(ctx) }