Вопрос проверяет опыт работы с контекстом.
WithTimeout задаёт ограничение от текущего момента (через N секунд/миллисекунд). WithDeadline фиксирует конкретное время окончания. Для API-запросов чаще берут WithTimeout, для задач с фиксированным дедлайном — WithDeadline.
Различие:
WithTimeout(ctx, d) → контекст отменяется через d времени;
WithDeadline(ctx, t) → контекст отменяется в конкретное время t.
Примеры:
ctx, cancel := context.WithTimeout(parent, 2*time.Second)
defer cancel()
ctx2, cancel2 := context.WithDeadline(parent, time.Now().Add(5*time.Second))
defer cancel2()Когда применять:
WithTimeout — типичный вариант для HTTP-запросов, RPC, ожидания воркера;
WithDeadline — для жёстких дедлайнов, например, cron-задача «должна закончиться до полуночи».
Вывод: WithTimeout удобнее для относительных ограничений, WithDeadline — для фиксированных.