Надёжного значения highest нет: горутины не ожидаются и конкурентно читают/пишут общую переменную. Println также не подставляет значение вместо %d.
Какой вывод получит программа в примере №41
Надёжного значения 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. В этой конкретной задаче параллельность избыточна: максимальное чётное число диапазона известно либо находится обычным циклом без накладных расходов.