Context — это стандартный механизм Go для управления дедлайнами и отменой операций между горутинами и границами API. Функция context.WithTimeout создаёт контекст, который автоматически отменяется после указанной длительности.
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
Этот паттерн устанавливает таймаут в одну секунду. Вызов defer cancel() критически важен, потому что он освобождает ресурсы сразу же, когда контекст больше не нужен, вместо ожидания истечения таймаута.
context.Background() – создаёт корневой контекст как отправная точкаtime.Second – задаёт длительность таймаутаcancel() – функция, которая вручную прерывает контекст раньше времени, если нужноdefer – гарантирует, что очистка произойдёт автоматически, предотвращая утечки ресурсовПередай контекст операциям, которые его поддерживают:
result, err := myFunction(ctx)
select {
case <-ctx.Done():
// Обработай таймаут или отмену
return ctx.Err()
case result := <-resultChan:
// Обработай результат
}
cancel() через defer, чтобы предотвратить утечки горутин и ресурсовctx.Done(), чтобы понять, когда произошёл таймаут или отменаctx.Err(), чтобы определить, был ли контекст отменён или истёк таймаутcontext.WithTimeout(parentCtx, duration), чтобы унаследовать дедлайны родителяЭтот подход идеален для сетевых запросов, запросов к базам данных, файловых операций и любых сценариев, где нужно предотвратить бесконечное зависание и обеспечить предсказуемое поведение приложения.
Оператор defer cancel() является опциональным при использовании context.WithTimeout, потому что контекст автоматически освободит ресурсы, когда истечёт timeout.
Новый — ещё не проверен сообществом
Вы