Какой вывод получит программа в примере №41

Надёжного значения highest нет: горутины не ожидаются и конкурентно читают/пишут общую переменную. Println также не подставляет значение вместо %d.

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

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

Надёжного значения highest нет: горутины не ожидаются и конкурентно читают/пишут общую переменную. Println также не подставляет значение вместо %d.

Подробный разбор

Ответ с пояснениями

Условие

Определите, какой текст будет выведен в консоль после выполнения следующей программы на Go:

import (
    "fmt"
)
func main() {
    var highest int

    for counter := 1000; counter > 0; counter-- {
        go func() {
            if counter%2 == 0 && counter > highest {
                highest = counter
            }
        }()
    }
    fmt.Println("Maximum is %d", highest)
}

Обратите внимание на работу горутин и захват переменных цикла.

Ответ

Надёжного значения highest нет: горутины не ожидаются и конкурентно читают/пишут общую переменную. Println также не подставляет значение вместо %d.

При старой семантике цикла есть ещё проблема общей counter; при новой переменные итераций разделены, но гонка highest и отсутствие ожидания остаются.

Для корректного параллельного решения защитите проверку и присваивание одним mutex, передавайте counter явно и дождитесь всех горутин через WaitGroup. Затем используйте fmt.Printf("Maximum is %d\n", highest) — получите 1000. В этой конкретной задаче параллельность избыточна: максимальное чётное число диапазона известно либо находится обычным циклом без накладных расходов.

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

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

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

Подробнее