Go 言語の goto ステートメントは、ラベルを使用してコード間を無条件にジャンプします。同時に、goto ステートメントは、ループから素早く抜け出し、反復終了を避けるのにも役立ちます。goto ステートメントを使用すると、一部のコードの実装プロセスを簡素化できます。 。
コンテンツ
表示
goto を使用して複数レベルのループを終了する
次のコードは、条件が満たされた場合に 2 層のループを連続して終了する必要があります。従来のコーディング方法は次のとおりです。
package main
import "fmt"
func main() {
var breakAgain bool
// 外側のループ
for x := 0; x < 10; x++ {
// 内側のループ
for y := 0; y < 10; y++ {
// 特定の条件を満たす場合、ループを終了
if y == 2 {
// フラグを設定
breakAgain = true
// ループを抜ける
break
}
}
// フラグに応じて、もう一度ループを終了する必要がある
if breakAgain {
break
}
}
fmt.Println("done")
}
コードの説明は次のとおりです。
- 10 行目は外側のループを構築します。
- 13 行目は内側のループを構築します。
- 16 行目では、y==2 のときにすべての for ループを終了する必要があります。
- 19 行目、デフォルトでは、ループはレイヤーごとにのみ終了できるため、状態変数 BreakAgain を設定する必要があり、終了が必要な場合はこの変数を true に設定します。
- 22 行目では、break を使用して現在のループを終了します。実行後、コードは 28 行目に移ります。
- 28行目は、1層目のループを抜けた後、変数breakAgainに従って外側のループを再度抜け出すかどうかを判断しています。
- 34 行目、すべてのループを終了した後、完了を出力します。
Go 言語の goto ステートメントを使用して上記のコードを最適化します。
package main
import "fmt"
func main() {
for x := 0; x < 10; x++ {
for y := 0; y < 10; y++ {
if y == 2 {
// ラベルにジャンプ
goto breakHere
}
}
}
// 手動で戻る。ラベルに入らないようにする。
return
// ラベル
breakHere:
fmt.Println("done")
}
コードの説明は次のとおりです。
- 13 行目では、goto ステートメントを使用して、23 行目で定義されている指定されたラベルにジャンプします。
- 20 行目のラベルは goto でのみ使用できますが、コードの実行処理には影響しません。手動で戻らない場合、条件が満たされない場合は 24 行目のコードも実行されます。
- 行 23 は、breakHere ラベルを定義します。
goto ステートメントを使用すると、変数を追加しなくてもすべてのループをすぐに終了できます。
goto を使用してエラー処理を一元化する
複数の場所でコードの重複がある場合、エラー処理は困難になります。次に例を示します。
err := firstCheckError()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
err = secondCheckError()
if err != nil {
fmt.Println(err)
exitProcess()
return
}
fmt.Println("done")
コードの説明は次のとおりです。
- 行 1 はいくつかのロジックを実行し、エラーを返します。
- 2 行目から 6 行目は、エラーが発生した場合にエラーを出力し、プロセスを終了します。
- 8 行目では、いくつかのロジックが実行され、エラーが返されます。
- 行 10 ~ 14 は、エラーが発生した後にプロセスを終了します。
- 16 行目で、印刷はエラーなしで完了します。
上記のコードには、繰り返しエラー処理コードが含まれている場合がありますが、これらのコードに後から判定を追加した場合、同様のコードを順次修正する必要があり、過失やミスが発生しやすくなります。
goto ステートメントを使用して、同じロジックを実現します。
err := firstCheckError()
if err != nil {
goto onExit
}
err = secondCheckError()
if err != nil {
goto onExit
}
fmt.Println("done")
return
onExit:
fmt.Println(err)
exitProcess()
コードの説明は次のとおりです。
- 行 3 と行 9 では、エラーが発生すると、エラー ラベル onExit にジャンプします。
- 17 行目と 18 行目では、すべてのプロセスを集約してエラーを出力し、プロセスを終了します。
「 Go 言語の goto ステートメント – 指定されたラベルにジャンプします」についてわかりやすく解説!絶対に観るべきベスト2動画
【プログラミング入門】これからはじめるGo(Go言語/golang)- tenntenn Conference 2022
#15 初見のGo言語で掲示板を作ってみる シャチョーのコードチャレンジ!