Menu
CoddyTech

Оператор `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 может затруднить чтение и сопровождение кода, поэтому обычно её не рекомендуют использовать вместо структурированного управления потоком выполнения.

challenge icon

Задание

Легко

В этом задании ты потренируешься использовать инструкцию goto, чтобы создать простой механизм повторных попыток. Ты создаёшь систему подключения, которая пытается установить соединение и повторяет попытку заданное число раз, если подключиться не удалось.

Тебе будут переданы два входных значения:

  • Строка, представляющая максимальное число повторных попыток (например, "3")
  • Строка, представляющая номер попытки, которая завершится успешно (например, "2")

Твоя задача:

  1. Преобразовать максимальное число повторных попыток из первого входного значения в целое число
  2. Преобразовать номер успешной попытки из второго входного значения в целое число
  3. Использовать инструкцию goto с меткой, чтобы реализовать логику повторных попыток
  4. Начать с номера попытки 1 и увеличивать его после каждой неудачной попытки
  5. Для каждой неудачной попытки вывести "Attempt [attempt_number] failed"
  6. Когда номер попытки совпадёт с номером успешной попытки, вывести "Attempt [attempt_number] succeeded" и завершить выполнение
  7. Если ты превысишь максимальное число повторных попыток, так и не добившись успеха, вывести "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 с меткой, чтобы реализовать логику повторных попыток
    
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go