Menu
Coddy logo textTech

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

quiz iconПроверьте себя

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

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.

Шпаргалка

Оператор 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 с меткой для реализации логики повторных попыток
    
}
quiz iconПроверьте себя

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

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