Оператор `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.
Шпаргалка
Оператор goto передает управление непосредственно помеченному оператору внутри той же функции. Определите метку с помощью идентификатора, за которым следует двоеточие, а затем перейдите к ней с помощью goto:
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}Хотя goto доступен в Go, он редко используется в современном программировании на Go, так как структурированное управление потоком, такое как циклы и операторы if, более понятно и удобно в сопровождении.
Попробуйте сами
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Сравнение картИтоги: счетчик частоты слов3Интерфейсы (Основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование интерфейсных типовПустой интерфейсУтверждение типаПереключатель типовИтоги: Фигуры и поведение