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.
Wyzwanie
ŁatwyW 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:
- Odczytać maksymalną liczbę ponownych prób z pierwszego wejścia
- Odczytać numer próby, która zakończy się sukcesem, z drugiego wejścia
- Użyć instrukcji
gotoz etykietą, aby zaimplementować logikę ponawiania prób - Rozpocząć od próby numer 1 i zwiększać numer po każdej nieudanej próbie
- Po każdej nieudanej próbie wyświetlić
"Attempt [attempt_number] failed" - 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 - 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
}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
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online