Исходный фрагмент не компилируется: в case нужен двоеточие, а функция называется fmt.Println. После этих исправлений обычно будет Timeout: дочерний контекст не продлевает дедлайн родителя.
Какой текст выведет программа в консоль (пример 22)
Исходный фрагмент не компилируется: в case нужен двоеточие, а функция называется fmt.Println. После этих исправлений обычно будет Timeout: дочерний контекст не продлевает дедлайн родителя.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какой вывод появится в консоли после выполнения следующего кода.
func main () {
ctx, _ :=context.WithTimeout(context.Background(), 3 * time.Second)
time.Sleep(2950 * time.Millisecond)
doDbRequest(ctx)
}
func doDbRequest(ctx context.Context) {
newCtx, _ := context.WithTimeout(ctx, 10*time.Second)
timer := time.NewTimer(1 * time.Second)
select {
case <- newCtx.Done();
fmt.println("Timeout")
case <- timer.C:
fmt.Println("Request Done")
}
}
Ответ
Исходный фрагмент не компилируется: в case нужен двоеточие, а функция называется fmt.Println. После этих исправлений обычно будет Timeout: дочерний контекст не продлевает дедлайн родителя.
После Sleep до родительского дедлайна остаётся примерно 50 мс, а новый таймер рассчитан на секунду. Однако при долгой приостановке выполнения обе ветки select могут оказаться готовыми, и выбор не гарантирован. Для корректного управления ресурсами сохраняйте cancel обоих контекстов и останавливайте timer. Тайм-аут родителя всегда ограничивает время жизни дочернего контекста.