goto
を使ったネストしたループの脱出
break
を使ってネストしたループを脱出するのは面倒です。なぜなら、通常、追加のロジックや変数が必要だからです。goto
は、複数のループから直接ジャンプできるため、このプロセスを簡素化します。
例: goto
を使ってネストしたループを脱出する
- 新しいファイル
nested_loop_with_goto.go
を作成します。
cd ~/project
touch nested_loop_with_goto.go
- 以下のコードを書きます。
package main
import "fmt"
func main() {
for i := 0; i < 5; i++ { // 外側のループ
for j := 0; j < 5; j++ { // 内側のループ
if j == 3 { // 脱出条件
goto END // "END" というラベルにジャンプ
}
fmt.Println(i, j) // i と j の現在の値を出力
}
}
END:
}
- プログラムはネストしたループから始まります。
i
用の外側のループと j
用の内側のループです。
- 内側のループ内で、
j
が3に等しいかどうかをチェックします。等しい場合、プログラムは END
というラベルにジャンプして、両方のループを脱出します。
- 結果として、プログラムは
j
が2に等しくなるまでの (i, j)
のペアを出力します。
- プログラムを実行します。
go run nested_loop_with_goto.go
- 出力を確認します。
0 0
0 1
0 2
このアプローチは、特に深くネストしたループでは、複数の break
文やフラグを使うよりもはるかにクリーンです。
このプログラムを break
文を使って実装する場合、以下のようになります。
package main
import "fmt"
func main() {
// チェック用の変数
var check = false
// 最初のループ
for i := 0; i < 5; i++ {
// 2番目のループ
for j := 0; j < 5; j++ {
if j == 3 {
// 2番目のループを脱出
check = true
break
}
fmt.Println(i, j)
}
// 最初のループを脱出するかどうかを判断
if check == true {
break
}
}
}