ホームページ バックエンド開発 Golang Go言語でgotoを使う方法

Go言語でgotoを使う方法

Nov 23, 2022 pm 06:40 PM
言語を移動 goto

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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Go's Crawler Collyのキュースレッドの問題は何ですか? Go's Crawler Collyのキュースレッドの問題は何ですか? Apr 02, 2025 pm 02:09 PM

Go Crawler Collyのキュースレッドの問題は、Go言語でColly Crawler Libraryを使用する問題を調査します。 �...

GOの浮動小数点番号操作に使用されるライブラリは何ですか? GOの浮動小数点番号操作に使用されるライブラリは何ですか? Apr 02, 2025 pm 02:06 PM

GO言語の浮動小数点数操作に使用されるライブラリは、精度を確保する方法を紹介します...

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか? Apr 02, 2025 pm 05:09 PM

Golandのカスタム構造ラベルが表示されない場合はどうすればよいですか?ゴーランドを使用するためにGolandを使用する場合、多くの開発者はカスタム構造タグに遭遇します...

Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Goでは、Printlnとstring()関数を備えた文字列を印刷すると、なぜ異なる効果があるのですか? Apr 02, 2025 pm 02:03 PM

Go言語での文字列印刷の違い:printlnとstring()関数を使用する効果の違いはGOにあります...

GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Redisストリームを使用してGO言語でメッセージキューを実装する場合、user_idタイプの変換の問題を解決する方法は? Apr 02, 2025 pm 04:54 PM

redisstreamを使用してGo言語でメッセージキューを実装する問題は、GO言語とRedisを使用することです...

GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? GO言語の「VAR」と「タイプ」キーワード定義構造の違いは何ですか? Apr 02, 2025 pm 12:57 PM

GO言語で構造を定義する2つの方法:VARとタイプのキーワードの違い。構造を定義するとき、GO言語はしばしば2つの異なる執筆方法を見ます:最初...

GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? GoおよびViperライブラリを使用するときにポインターを渡す必要があるのはなぜですか? Apr 02, 2025 pm 04:00 PM

ポインター構文とviperライブラリの使用における問題への取り組みGO言語でプログラミングするとき、特にポインターの構文と使用を理解することが重要です...

See all articles