Menu
Coddy logo textTech

Instrukcja `goto`

Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 4 z 68.

Instrukcja goto w Go pozwala bezpośrednio przekazać sterowanie do oznaczonej etykietą instrukcji w obrębie tej samej funkcji. Chociaż Go obsługuje tę funkcję, we współczesnym programowaniu w Go rzadko się jej używa, ponieważ preferowane są bardziej czytelne struktury sterujące, takie jak pętle i instrukcje if.

Aby użyć goto, najpierw definiujesz etykietę, zapisując identyfikator, po którym następuje dwukropek. Następnie możesz przejść do tej etykiety, używając goto, po którym podajesz nazwę etykiety.

func main() {
    i := 0
start:
    fmt.Println("Count:", i)
    i++
    if i < 3 {
        goto start
    }
    fmt.Println("Done!")
}

W tym przykładzie program wraca do etykiety start, dopóki warunek jest spełniony. Jednak tę samą logikę można by znacznie czytelniej zapisać za pomocą pętli for. Instrukcja goto może utrudniać czytanie i utrzymanie kodu, dlatego zazwyczaj odradza się jej używanie na rzecz uporządkowanego sterowania przepływem programu.

challenge icon

Wyzwanie

Łatwy

W tym wyzwaniu poćwiczysz używanie instrukcji goto do utworzenia prostego mechanizmu ponawiania prób. Budujesz system połączeń, który próbuje nawiązać połączenie i ponawia próbę określoną liczbę razy, jeśli się nie powiedzie.

Otrzymasz dwa dane wejściowe:

  • Ciąg znaków reprezentujący maksymalną liczbę ponownych prób (np. "3")
  • Ciąg znaków reprezentujący numer próby, która zakończy się sukcesem (np. "2")

Twoim zadaniem jest:

  1. Odczytać maksymalną liczbę ponownych prób z pierwszego wejścia
  2. Odczytać numer próby, która zakończy się sukcesem, z drugiego wejścia
  3. Użyć instrukcji goto z etykietą, aby zaimplementować logikę ponawiania prób
  4. Rozpocząć od próby numer 1 i zwiększać numer po każdej nieudanej próbie
  5. Po każdej nieudanej próbie wyświetlić "Attempt [attempt_number] failed"
  6. Gdy numer próby będzie równy numerowi próby zakończonej sukcesem, wyświetlić "Attempt [attempt_number] succeeded" i zakończyć działanie
  7. Jeśli przekroczysz maksymalną liczbę ponownych prób bez powodzenia, wyświetlić "All attempts failed" i zakończyć działanie

Użyj instrukcji goto, aby wrócić do etykiety ponawiania próby, gdy próba się nie powiedzie i nie przekroczysz maksymalnej liczby prób. Numery prób powinny zaczynać się od 1.

Spróbuj swoich sił

package main

import (
    "fmt"
    "strconv"
)

func main() {
    // Wczytaj dane wejściowe
    var maxRetriesStr string
    var successAttemptStr string
    fmt.Scanln(&maxRetriesStr)
    fmt.Scanln(&successAttemptStr)
    
    // Przekształć dane wejściowe na liczby całkowite
    maxRetries, _ := strconv.Atoi(maxRetriesStr)
    successAttempt, _ := strconv.Atoi(successAttemptStr)
    
    // Zainicjalizuj licznik prób
    attempt := 1
    
    // TODO: Napisz swój kod poniżej
    // Użyj instrukcji goto z etykietą, aby zaimplementować logikę ponawiania prób
    
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ sterowania

Poćwicz samodzielnie: Kompilator Go online