Какой текст выведет программа в консоль (пример 22)

Исходный фрагмент не компилируется: в case нужен двоеточие, а функция называется fmt.Println. После этих исправлений обычно будет Timeout: дочерний контекст не продлевает дедлайн родителя.

Короткий ответ

Что ответить на собеседовании

Исходный фрагмент не компилируется: в 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. Тайм-аут родителя всегда ограничивает время жизни дочернего контекста.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее