Используйте горутину-потребитель, которая последовательно читает числа из канала и вызывает printNumber. Она сохранит порядок и секундную паузу, а main дождётся завершения.
Конкурентный вывод чисел в строгом порядке
Используйте горутину-потребитель, которая последовательно читает числа из канала и вызывает printNumber. Она сохранит порядок и секундную паузу, а main дождётся завершения.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо написать программу, использующую горутины, которая выводит числа от 1 до 10 последовательно, при этом перед печатью каждого числа делается пауза в одну секунду.
package main
import (
"fmt"
"time"
)
func main() {
// ...
}
func printNumber(n int) {
time.Sleep(time.Second)
fmt.Println(n)
}
Ответ
Используйте горутину-потребитель, которая последовательно читает числа из канала и вызывает printNumber. Она сохранит порядок и секундную паузу, а main дождётся завершения.
К существующей printNumber добавьте:
func main() {
numbers := make(chan int)
done := make(chan struct{})
go func() {
defer close(done)
for n := range numbers { printNumber(n) }
}()
for n := 1; n <= 10; n++ { numbers <- n }
close(numbers)
<-done
}
Здесь есть конкурентные producer и consumer, но печать намеренно последовательна. Это занимает примерно десять секунд или больше; независимые горутины с одинаковым Sleep не обеспечили бы ни порядок, ни отдельную паузу между числами.