Реализуйте DoRequest, который выполняет GET-запрос по url, используя
переданный ctx, но дополнительно ограничивает его жёстким таймаутом 200ms.
Правила:
- Внутри функции на основе
ctx создаётся производный контекст с таймаутом
200ms (жёсткий потолок), не зависящий от дедлайна внешнего ctx.
- Запрос строится через
http.NewRequestWithContext с этим контекстом.
- При успехе возвращается прочитанное тело ответа.
- При таймауте (или отмене) ресурсы корректно освобождаются (тело закрывается),
функция не зависает и возвращает ошибку (включая
context deadline).
// DoRequest выполняет GET url с context, ограниченным жёстким таймаутом 200ms.
// При таймауте корректно освобождает ресурсы (закрывает тело). Возвращает тело
// ответа или ошибку (включая context deadline).
func DoRequest(ctx context.Context, url string) ([]byte, error) {
// Ваша реализация
}
Подсказка: ctx, cancel := context.WithTimeout(ctx, 200*time.Millisecond),
defer cancel(), http.NewRequestWithContext, http.DefaultClient.Do,
defer resp.Body.Close(), io.ReadAll.
На что смотрит интервьюер:
- Производный контекст с жёстким таймаутом 200ms поверх переданного
ctx.
- Обязательный
defer cancel() — нет утечки контекста/таймера.
- Закрытие
resp.Body через defer даже на путях с ошибкой чтения.
- Корректный возврат ошибки дедлайна без зависания на медленном сервере.