Исходный main содержит гонку по max и не ждёт горутины. Для диапазона 1…n максимум находится без параллелизма: это n, если оно чётное, иначе n−1.
// Находим максимальное четное число
Исходный main содержит гонку по max и не ждёт горутины. Для диапазона 1…n максимум находится без параллелизма: это n, если оно чётное, иначе n−1.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
// Находим максимальное четное число
package main
import "fmt"
func main() { var max int
for i := 1000; i > 0; i-- {
go func() {
if i%2 == 0 && i > max {
max = i
}
}()
}
fmt.Printf("Maximum is %d", max)
}
func maxEvent(n, workers int) int { var wg sync.WaitGroup
results := make(chan int, workers)
jobs := make(chan int, workers)
for w := 0; w < workers; w++ {
wg.Add(1)
go func() {
defer wg.Done()
localMax := -1
for num := range jobs {
if num%2 == 0 && num > localMax {
localMax = num
}
}
result <- localMax
}()
}
go func() {
for i := 1; i <= n; i++ {
jobs <- i
}
close(jobs)
}()
go func() {
wg.Wait()
close(results)
}()
globalMax := -1
for localMax := range results {
if localMax > globalMax {
globalMax = localMax
}
}
return globalMax
}
Ответ
Исходный main содержит гонку по max и не ждёт горутины. Для диапазона 1…n максимум находится без параллелизма: это n, если оно чётное, иначе n−1.
func maxEven(n int) int {
if n < 2 { return -1 }
return n - n%2
}
Для n=1000 ответ 1000. В worker-варианте из условия нужно исправить result на results, импортировать sync и отклонять workers<=0. Закрывает jobs отправитель, results — горутина после wg.Wait; каждый worker считает собственный максимум, общий результат собирается одним читателем.
Если оставить первый main, никакого устойчивого вывода нет из-за гонки и отсутствия ожидания. Захват переменной цикла дополнительно зависит от версии Go, но саму гонку обновления max это не устраняет.