Go言語でgotoを使う方法

青灯夜游
リリース: 2022-11-24 20:16:31
オリジナル
5893 人が閲覧しました

Go 言語では、goto ステートメントは無条件ジャンプに使用され、プログラム内の指定された行に無条件に転送でき、ラベルを介してコード間の無条件ジャンプを実行します。 goto の後にはラベルが続きます。このラベルの意味は、Go プログラムにコードのどの行を次に実行するかを指示することです。構文は "goto label;... ...label:expression;" です。 goto は、元のコードの実行順序を破り、指定された行に直接ジャンプしてコードを実行します。goto ステートメントは通常、条件ステートメントと組み合わせて使用​​され、条件付き転送、ループの形成、ループからのジャンプなどの機能を実装するために使用できます。ループ本体。

Go言語でgotoを使う方法

このチュートリアルの動作環境: Windows 7 システム、GO バージョン 1.18、Dell G3 コンピューター。

Go 言語の goto ステートメント

goto Gu Yansiyi はジャンプを意味します。

Go 言語の goto 文は、プログラム中の指定行へ無条件に移動したり、ラベルを介してコード間を無条件にジャンプしたりすることができると同時に、ループやループから素早く抜け出すのにも役立ちます。 goto ステートメントを使用すると、一部のコードの実装プロセスを簡素化できます。

goto ステートメントの構文

goto の後にはラベルが続きます。このラベルの意味は、次にどのコード行を実行するかを Go プログラムに指示することです。

したがって、このラベルをどこにどのように配置するかが、goto で注意を払う最も重要なことです。

goto 标签;
...
...
标签: 表达式;
ログイン後にコピー

goto ステートメントのフローチャートは次のとおりです。

Go言語でgotoを使う方法

goto ステートメントの使用法

  • goto は、元のコードの実行順序を破って、コード実行の特定の行に直接ジャンプできます。

import "fmt"

func main() {

    goto flag
    fmt.Println("B")
flag:
    fmt.Println("A")

}
ログイン後にコピー

実行結果は B を出力しませんが、A

A
ログイン後にコピー
  • goto ステートメントのみが通常、条件ステートメントと組み合わせて使用​​されます。条件付き転送の実装、ループの形成、ループ本体からのジャンプなどの機能を使用できます。

これは、goto を使用して 1 から 5 を出力するループを実装する例です。

import "fmt"

func main() {
    i := 1
flag:
    if i <= 5 {
        fmt.Println(i)
        i++
        goto flag
    }
}
ログイン後にコピー

出力は次のとおりです

Go言語でgotoを使う方法

別の例として、goto を使用して type Break の効果を実現します。

import "fmt"

func main() {
    i := 1
    for {
        if i > 5 {
            goto flag
        }
        fmt.Println(i)
        i++
    }
flag:
}
ログイン後にコピー

出力は次のとおりです

Go言語でgotoを使う方法

最後に、例として、goto を使用して type continue の効果を実現し、1 から 1 までのすべての偶数を出力します。 10.

import "fmt"

func main() {
    i := 1
flag:
    for i <= 10 {
        if i%2 == 1 {
            i++
            goto flag
        }
        fmt.Println(i)
        i++
    }
}
ログイン後にコピー

出力は次のとおりです

Go言語で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、デフォルトでは、ループは一度に 1 レベルのみ終了できます。これを行うには、状態変数 BreakAgain を設定する必要があります。終了する必要がある場合は、この変数を設定します本当のこと。

  • 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 行,汇总所有流程进行错误打印并退出进程。

注意事项

goto语句与标签之间不能有变量声明,否则编译错误。

import "fmt"

func main() {
    fmt.Println("start")
    goto flag
    var say = "hello oldboy"
    fmt.Println(say)
flag:
    fmt.Println("end")
}
ログイン後にコピー

编译错误

.\main.go:7:7: goto flag jumps over declaration of say at .\main.go:8:6
ログイン後にコピー

【相关推荐:Go视频教程

以上がGo言語でgotoを使う方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート