Ответ
Оба метода создают контекст с ограничением времени, но работают по-разному:
- WithTimeout принимает duration (относительное время):
ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second)
- WithDeadline принимает конкретный момент времени (абсолютное время):
deadline := time.Now().Add(2 * time.Second)
ctx, cancel := context.WithDeadline(context.Background(), deadline)
Ключевые отличия:
- WithTimeout удобнее для относительных интервалов ("ждать 5 секунд")
- WithDeadline полезен когда известно точное время завершения
- Оба возвращают cancel-функцию, которую нужно вызывать для освобождения ресурсов
- При срабатывании таймаута/дедлайна контекст автоматически отменяется
Под капотом WithTimeout просто вызывает WithDeadline, добавляя duration к текущему времени.