Оператор `goto`
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 4 из 68.
Оператор goto в Go позволяет напрямую передать управление помеченному оператору в той же функции. Хотя в Go есть эта возможность, в современной разработке на Go её используют редко, поскольку обычно предпочитают более понятные управляющие конструкции, такие как циклы и операторы if.
Чтобы использовать goto, сначала определите метку, записав идентификатор, за которым следует двоеточие. Затем вы можете перейти к этой метке, используя goto, за которым следует имя метки.
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}В этом примере программа возвращается к метке start, пока условие не перестанет выполняться. Однако эту же логику было бы гораздо понятнее выразить с помощью цикла for. Инструкция goto может затруднить чтение и сопровождение кода, поэтому обычно её не рекомендуют использовать вместо структурированного управления потоком выполнения.
Задание
ЛегкоВ этом задании ты потренируешься использовать инструкцию goto, чтобы создать простой механизм повторных попыток. Ты создаёшь систему подключения, которая пытается установить соединение и повторяет попытку заданное число раз, если подключиться не удалось.
Тебе будут переданы два входных значения:
- Строка, представляющая максимальное число повторных попыток (например,
"3") - Строка, представляющая номер попытки, которая завершится успешно (например,
"2")
Твоя задача:
- Преобразовать максимальное число повторных попыток из первого входного значения в целое число
- Преобразовать номер успешной попытки из второго входного значения в целое число
- Использовать инструкцию
gotoс меткой, чтобы реализовать логику повторных попыток - Начать с номера попытки 1 и увеличивать его после каждой неудачной попытки
- Для каждой неудачной попытки вывести
"Attempt [attempt_number] failed" - Когда номер попытки совпадёт с номером успешной попытки, вывести
"Attempt [attempt_number] succeeded"и завершить выполнение - Если ты превысишь максимальное число повторных попыток, так и не добившись успеха, вывести
"All attempts failed"и завершить выполнение
Используй инструкцию goto, чтобы вернуться к метке повторной попытки, если попытка не удалась и ты ещё не превысил максимальное число попыток. Нумерация попыток должна начинаться с 1.
Попробуйте сами
package main
import (
"fmt"
"strconv"
)
func main() {
// Считайте входные данные
var maxRetriesStr string
var successAttemptStr string
fmt.Scanln(&maxRetriesStr)
fmt.Scanln(&successAttemptStr)
// Преобразуйте входные данные в целые числа
maxRetries, _ := strconv.Atoi(maxRetriesStr)
successAttempt, _ := strconv.Atoi(successAttemptStr)
// Инициализируйте счётчик попыток
attempt := 1
// TODO: Напишите свой код ниже
// Используйте оператор goto с меткой, чтобы реализовать логику повторных попыток
}В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go