Go練習問題2-05:ラベルとgoto文を理解しよう

記事内に商品プロモーションを含む場合があります

Go言語の初心者向け問題2-5:ラベルとgoto文を理解しよう

この問題を解くために必要な知識:
レベル1の知識論理演算子と代入演算子条件分岐(if-else文)条件分岐(switch文)ループ処理(for文)ラベルとgoto文無限ループ配列スライスとキャパシティ整列と検索マップループ処理(range文)サードパーティパッケージ

<<前の問題 問題集Top 次の問題>>

Go言語の文法「ラベル」と「goto文」とは





ここでは「ラベル」と「goto文」の意味や使い方を復習します。必要ない方はここをクリックして練習問題へ飛びましょう。

Go言語のラベルとgoto文は、制御の流れを自由にジャンプさせるための機能です。

しかし、goto文は慎重に使う必要があり、コードの可読性が損なわれることがあるため、十分に注意して使いましょう。

ラベルとgoto文の基本

ラベルは任意の位置に配置でき、goto文によってそのラベルにジャンプできます。ラベルはコロン(:)で終わる名前で定義されます。

基本的な構文は次の通りです。

labelName:
    // 処理内容

goto labelName

実例

次の例では、goto文を使ってループから早期に抜け出す方法を示します。

package main

import "fmt"

func main() {
    for i := 0; i < 10; i++ {
        for j := 0; j < 10; j++ {
            if i*j > 25 {
                goto EndLoop
            }
            fmt.Printf("%d * %d = %d\n", i, j, i*j)
        }
    }
EndLoop:
    fmt.Println("ループを抜けました")
}

このプログラムは、i * j が25を超えたときに、goto文を使ってラベルEndLoopにジャンプし、ループを終了します。

注意点

goto文は、コードの流れを理解しづらくする可能性があるため、使用は最小限に抑えるべきです。多くのプログラミングでは、構造化された制御構文(例えば、breakcontinuereturn)を使用する方が良いとされています。

goto文は特殊な状況(エラーハンドリングなど)で役立つことがありますが、その使用には注意が必要です。

Go練習問題2-5:ラベルとgoto文を使用した再入力プログラムを作成しよう

1から5までの整数をユーザーに入力させ、入力された数値が範囲外であれば再度入力を求めるプログラムを作成してください。

プログラムは「ラベルとgoto文」を使用して再入力の処理を実装します。

この問題の要件

以下の要件に従ってコードを完成させてください。

  • 整数型の変数numを宣言し、ユーザーに1から5の間の整数を入力させること。
  • 入力値が1から5の間でない場合は、エラーメッセージを表示し、再度入力を促すこと。
  • 正しい入力が行われた場合には、その入力値を表示してプログラムを終了すること。
  • 再入力処理にはgoto文とラベルを使用すること。

ただし、以下のような実行結果となるコードを書くこと。

*****↓↓正解コードの実行結果の例↓↓*****

1から5の間の整数を入力してください:
8
無効な数値です。再度入力してください。
1から5の間の整数を入力してください:
3
入力された数値は 3 です。

この問題を解くヒント

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1.パッケージ宣言とインポート
 1-1. package main:メインパッケージの宣言
 1-2. import "fmt":標準ライブラリfmtのインポート

2.main関数の定義
 2-1. func main() {:main関数の開始

3.変数の宣言
 3-1. var num int:整数型変数numの宣言

4.ラベルの宣言
 4-1. RETRY::再入力処理のためのラベルRETRYの宣言

5.ユーザー入力の受け取り
 5-1. fmt.Println("1から5の間の整数を入力してください:"):入力を促すメッセージの表示
 5-2. fmt.Scan(&num):ユーザーからの入力を受け取る

6.条件分岐による入力チェック
 6-1. if num < 1 || num > 5 {:入力が1から5の範囲外であるかをチェック
  6-1-1. fmt.Println("無効な数値です。再度入力してください。"):無効な入力の場合のエラーメッセージの表示
  6-1-2. goto RETRY:再入力を促すため、ラベルRETRYにジャンプ
 6-2. }:条件分岐の終了

7.正しい入力の場合の処理
 7-1. fmt.Printf("入力された数値は %d です。\n", num):正しい入力がされた場合、その値を表示

8.main関数の終了
 8-1. }:main関数の終了

ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

package main

import "fmt"

func main() {
    var num int

RETRY:
    /*【穴埋め問題1】
    ここに数値入力を促すメッセージを表示するコードを書いてください。
    */

    /*【穴埋め問題2】
    ここにユーザーから入力を受け取るコードを書いてください。
    */

    /*【穴埋め問題3】
    ここに条件分岐で入力値をチェックし、無効な場合に再入力を促すコードを書いてください。
    */

    /*【穴埋め問題4】
    ここに正しい入力がされた場合に数値を表示するコードを書いてください。
    */
}

 

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

解答例

この問題の一つの正解例とそのコードの解説を以下に示します。

正解コードの例

例えば以下のようなプログラムが考えられます。

package main

import "fmt"

func main() {
    var num int

RETRY:
    fmt.Println("1から5の間の整数を入力してください:")
    
    // ユーザーの入力を受け取る
    fmt.Scan(&num)

    // 入力された数値をチェックし、無効な場合は再度入力を促す
    if num < 1 || num > 5 {
        fmt.Println("無効な数値です。再度入力してください。")
        goto RETRY
    }

    fmt.Printf("入力された数値は %d です。\n", num)
}

正解コードの解説

このコードは、Go言語における「ラベルとgoto文」の使用方法を学ぶための基本的な例です。コード全体の動作と各部分について詳しく解説します。

パッケージ宣言とインポート

package main
import "fmt"

package main はGoプログラムのエントリーポイントとなるパッケージを宣言します。

import "fmt" は標準ライブラリの fmt パッケージをインポートしており、文字列の出力やフォーマットを行うために使用します。

main関数の定義

func main() {

main 関数はGoプログラムのエントリーポイントです。プログラムの実行はこの関数から始まります。

変数の宣言

var num int

var num int は整数型の変数 num を宣言しています。ユーザーから入力された数値を格納するために使用されます。

ラベルの定義と再入力処理

RETRY:

RETRY: はラベルを定義しています。goto 文を使ってこのラベルにジャンプし、特定のコードブロックを繰り返し実行できます。

ユーザー入力の受け取り

fmt.Println("1から5の間の整数を入力してください:")
fmt.Scan(&num)

fmt.Println はメッセージを表示します。ユーザーに1から5の間の整数を入力するよう促します。

fmt.Scan(&num) はユーザーが入力した整数を変数 num に格納します。

条件分岐とgoto文の使用

if num < 1 || num > 5 {
    fmt.Println("無効な数値です。再度入力してください。")
    goto RETRY
}

if num < 1 || num > 5 は入力された数値が1から5の範囲外であるかを確認します。

無効な入力がされた場合、エラーメッセージを表示し、goto RETRY により RETRY ラベルの位置にジャンプし、再度入力を促します。

正しい入力の場合の処理

fmt.Printf("入力された数値は %d です。\n", num)

有効な数値が入力された場合、fmt.Printf を使ってその値を表示します。

<<前の問題 問題集Top 次の問題>>

この問題への質問・コメント

この問題を作成するにあたりAIを活用しています。

問題ないことは確認していますが、もし間違いや表現の違和感などありましたら、ご指摘頂けると大変助かります。






    Go練習問題集へ戻る
    トップページへ戻る