ホーム プログラミング言語 golang golang flow control Go 言語の goto ステートメント – 指定されたラベルにジャンプします






Go 言語の goto ステートメント – 指定されたラベルにジャンプします




 
 
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言語で掲示板を作ってみる シャチョーのコードチャレンジ!