第5章 制御構造

Go言語における「制御構造」はプログラムの流れを制御するために使用され、プログラムの複雑さを管理し、異なる条件や繰り返しの処理を実現します。Goにはいくつかの主要な制御構造があります。


if文

if文は条件に基づいて異なる実行パスを選択します。elseelse ifを用いて、複数の条件をチェーンできます。

x := 10

if x < 0 {
    fmt.Println(x, "は負の数です")
} else if x == 0 {
    fmt.Println(x, "はゼロです")
} else {
    fmt.Println(x, "は正の数です")
}


forループ

forループは繰り返し処理に使用されます。Go言語にはforループのみがあり、whileループはありません。

for i := 0; i < 5; i++ {
    fmt.Println("繰り返し回数:", i)
}


range

rangeはスライスやマップを繰り返し処理するために使います。各要素のインデックスや値にアクセスできます。

fruits := []string{"apple", "banana", "cherry"}
for i, fruit := range fruits {
    fmt.Println(i, fruit)
}


switch文

switch文は複数の条件分岐を簡潔に書くために使用されます。Goのswitchは他の言語と比べて柔軟です。

day := 3

switch day {
case 1:
    fmt.Println("月曜日")
case 2:
    fmt.Println("火曜日")
case 3:
    fmt.Println("水曜日")
default:
    fmt.Println("他の日")
}


breakとcontinue

breakはループの実行を中断し、continueは次のループの反復へ制御を移します。

for i := 0; i < 10; i++ {
    if i%2 == 0 {
        continue
    }
    if i > 5 {
        break
    }
    fmt.Println(i)
}


defer文

defer文は、関数の実行を現在の関数の終了時まで遅延させるために使用されます。これは主にリソースの解放やクリーンアップ処理に役立ちます。

func main() {
    defer fmt.Println("世界")
    fmt.Println("こんにちは")
}
// 出力:
// こんにちは
// 世界


goto文

goto文はプログラム内の別の位置に制御を移動させます。ただし、適切な使い方をしないと、プログラムの流れを読みにくくする可能性があるため、慎重に使用する必要があります。

func main() {
    var i int
loop:
    if i < 5 {
        fmt.Println(i)
        i++
        goto loop
    }
}


panicとrecover

panic関数は、通常の関数フローを中断し、直ちにエラーを発生させます。

recover関数はpanicによって発生したエラーから復旧するために使われます。

func mayPanic() {
    panic("問題発生")
}

func main() {
    defer func() {
        if r := recover(); r != nil {
            fmt.Println("回復:", r)
        }
    }()
    mayPanic()
    fmt.Println("この行は実行されません")
}


練習問題1.

整数xが与えられたとき、xが偶数か奇数かを判定し、結果を出力するGoプログラムを書いてください。

x := 4
// ここにコードを書く


練習問題2.

1から10までの数値を合計し、その結果を出力するGoプログラムを書いてください。


練習問題3.

整数dayが与えられたとき、それに対応する曜日を出力するGoプログラムを書いてください。dayは1から7の範囲とし、1が月曜日、7が日曜日に対応するとします。範囲外の数値が与えられた場合は「不正な入力です」と出力します。

day := 3
// ここにコードを書く