Middle
Дар бораи ҳолатҳои истифодаи контекст дар Go нақл кунед.
sobes.tech AI
Ҷавоб аз AI
Контекст у Go се користи за управљање животним циклусом захтева и контролу извршавања горутин. Главни случајеви примене:
- Отказивање: Омогућава отказивање ланца горутина повезаног са одређеним захтевом. На пример, при затварању везе или по истеку времена.
- Тиме-аут: Поставља крајњи рок за извршење операције. Ако операција не заврши навреме, контекст се отказује. Ово спречава бесконачно чекање.
- Пренос података специфичних за захтев: Омогућава пренос података који се односе на конкретан захтев (на пример, ID корисника, идентификатор трасирања) кроз ланац позива функција без промене њихових сигнатура.
Примери употребе:
-
Отказивање по сигналу:
пакет main import ( "context" "fmt" "time" ) функција worker(ctx context.Context, id int) { за { избор { случај <-ctx.Done(): fmt.Printf("Радник %d прекинут\n", id) връщане default: fmt.Printf("Радник %d ради...\n", id) time.Sleep(500 * time.Millisecond) } } } функција 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) // Дамо време горутинама да се заврше } -
Тиме-аут:
пакет main import ( "context" "fmt" "time" ) функција longOperation(ctx context.Context) error { избор { случај <-time.After(3 * time.Second): // Имитација дугог рада fmt.Println("Операција успешно завршена") връщане nil случај <-ctx.Done(): fmt.Println("Операција отказана од контекста:", ctx.Err()) връщане ctx.Err() } } функција main() { ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) defer cancel() err := longOperation(ctx) ако ако err != nil { fmt.Println("Грешка:", err) } } -
Пренос података:
пакет 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) }