Задача курса

Go defer: обратный порядок вызовов и ранний return

Курс «Golang с нуля» · урок «defer: порядок выполнения и отличие ожидаемой ошибки от panic»

Условие

Закрытие запущенных этапов

Когда сложная операция разбивается на несколько последовательных этапов, каждый из них требует аккуратного завершения — вне зависимости от того, чем закончился весь процесс. Пропустить закрытие хотя бы одного этапа значит оставить систему в неопределённом состоянии, поэтому порядок завершения не менее важен, чем порядок запуска.

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

Если число этапов выходит за допустимые пределы, программа сообщает об этом как об обычной ошибке и останавливается. В остальных случаях — будь то полный успех или досрочный выход из-за рядовой ошибки в середине работы — в конце всегда появляется итоговое сообщение. Наблюдая за выводом программы, можно убедиться, что закрытия действительно следуют в ожидаемом обратном порядке и финальная строка не теряется ни при каком из допустимых сценариев.

Что уже дано

Программа получает число этапов и выводит запуск каждого этапа в цикле.

Что нужно сделать

Допишите stopStages. При допустимом числе от 1 до 3 регистрируйте через defer закрытие каждого уже запущенного этапа. При выходе закрытия должны появиться в обратном порядке. Одно финальное сообщение сеанс завершён обязано появиться и при раннем возврате обычной ошибки. Для недопустимого числа верните errors.New("некорректное число этапов"); panic использовать нельзя.

Ввод и вывод

Программа читает одно целое число из stdin. Она печатает запуск этапов, затем отложенные закрытия и итоговую строку.

Примеры

Пример 1

Ввод
3
Ожидаемый результат
запустить этап 1
запустить этап 2
запустить этап 3
закрыть этап 3
закрыть этап 2
закрыть этап 1
сеанс завершён
результат: успешно

Попробуйте решить

РешениеGo
Без регистрации · результат не сохраняется