Одновременный вывод чисел с сохранением порядка

Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.

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

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

Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.

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

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

Условие

Необходимо поправить программу так, чтобы функция printNumber запускалась в нескольких горутинах, но при этом числа от 1 до 10 выводились строго последовательно (1, 2, 3, …, 10) с задержкой в одну секунду перед каждым выводом.

package main

import (
        "fmt"
        "time"
        )

func main() {
    for idx := 0; idx < 10; idx++ {
        printNumber(idx + 1)
    }
}

func printNumber(num int) {
    time.Sleep(time.Second)
    fmt.Println(num)
}

Ответ

Создайте цепочку разрешений: каждая горутина ждёт свой сигнал, вызывает printNumber и разрешает следующую. Печать остаётся последовательной, хотя работников несколько.

Замените main, оставив printNumber:

func main() {
    gates := make([]chan struct{}, 11)
    for i := range gates { gates[i] = make(chan struct{}) }
    for n := 1; n <= 10; n++ {
        go func(n int) {
            <-gates[n-1]
            printNumber(n)
            close(gates[n])
        }(n)
    }
    close(gates[0])
    <-gates[10]
}

Последний сигнал одновременно служит ожиданием завершения. Нельзя одновременно выполнять все паузы и обещать секундный промежуток между каждой печатью: эту часть приходится сериализовать.

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

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

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

Подробнее