`goto` 文
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 4/68。
Goにおけるgoto文は、同じ関数内のラベル付きステートメントに制御を直接移すことを可能にします。Goにはこの機能が含まれていますが、ループやif文のようなより明確な制御構造が好まれるため、現代のGoプログラミングではめったに使用されません。
gotoを使用するには、まず識別子の後にコロンを付けてラベルを定義します。次に、gotoの後にラベル名を続けて記述することで、そのラベルにジャンプできます。
func main() {
i := 0
start:
fmt.Println("Count:", i)
i++
if i < 3 {
goto start
}
fmt.Println("Done!")
}この例では、条件が満たされなくなるまで、プログラムは start ラベルに戻ります。しかし、この同じロジックは for ループを使用したほうがはるかに明確になります。goto 文はコードの可読性や保守性を低下させる可能性があるため、構造化された制御フローが好まれ、一般的には推奨されません。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
チャレンジ
簡単このチャレンジでは、goto 文を使用してシンプルなリトライメカニズムを作成する練習をします。接続を確立しようとし、失敗した場合には指定された回数だけリトライする接続システムを構築します。
2つの入力を受け取ります:
- 最大リトライ回数を表す文字列(例:
"3") - 成功する試行回数を表す文字列(例:
"2")
あなたのタスクは以下の通りです:
- 最初の入力から最大リトライ回数を解析する
- 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!")
}Go では goto を利用できますが、ループや if 文のような構造化された制御フローの方が明確で保守性が高いため、現代の Go プログラミングで使われることは稀です。
自分で試してみよう
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文を使用してリトライロジックを実装してください
}このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。