Go言語入門(2)「条件分岐とループをマスターしよう!制御構文の基礎」

スポンサーリンク
Go

前回で、変数宣言やデータ型、基本的な出力方法を学んだ方に向けて、今回は制御構文をご紹介しよう。

制御構文を理解することで、プログラムに「判断」と「繰り返し」の機能を持たせることができる。これにより、より実用的なプログラムを作成できるようになる。

1. if文による条件分岐「プログラムに判断させる」

プログラムに「もし〜なら」という判断をさせるのがif文である。

基本的なif文

package main

import "fmt"

func main() {
    age := 20
    
    if age >= 18 {
        fmt.Println("成人です")
    }
}
// 出力: 成人です

重要なポイント

  • 条件式は()で囲まない(Goの特徴)
  • {}は必須(1行でも省略できない)
  • 条件式の後ろに{を書く(改行しない)

if-else文

age := 15

if age >= 18 {
    fmt.Println("成人です")
} else {
    fmt.Println("未成年です")
}
// 出力: 未成年です

if-else if-else文

score := 75

if score >= 90 {
    fmt.Println("評価: A")
} else if score >= 70 {
    fmt.Println("評価: B")
} else if score >= 50 {
    fmt.Println("評価: C")
} else {
    fmt.Println("評価: D")
}
// 出力: 評価: B

初期化付きif文(Goの便利な機能)

Goでは、if文の中で変数を宣言して、そのスコープをif文内に限定できる

if num := 10; num%2 == 0 {
    fmt.Println(num, "は偶数です")
}
// numはこの外では使えない

この書き方は、変数を一時的にしか使わない場合に便利である。

2. switch文による多分岐「複数の条件をスマートに処理」

多くの条件分岐が必要な場合、switch文を使うとコードが読みやすくなる。

基本的なswitch文

day := "月曜日"

switch day {
case "月曜日":
    fmt.Println("週の始まりです")
case "金曜日":
    fmt.Println("週末が近いです")
case "土曜日", "日曜日":
    fmt.Println("休日です")
default:
    fmt.Println("平日です")
}
// 出力: 週の始まりです

Goのswitchの特徴

  • breakが不要(自動的に終了する)
  • 複数の値を,で指定できる
  • defaultは該当するcaseがない場合に実行される

条件式を使うswitch

score := 85

switch {
case score >= 90:
    fmt.Println("優秀です")
case score >= 70:
    fmt.Println("良好です")
case score >= 50:
    fmt.Println("合格です")
default:
    fmt.Println("不合格です")
}
// 出力: 良好です

switch文に式を書かない場合、各caseに条件式を記述できる。

fallthrough キーワード

通常、Goのswitchは該当するcaseを実行したら終了するが、fallthroughを使うと次のcaseも実行できる。

num := 1

switch num {
case 1:
    fmt.Println("1です")
    fallthrough
case 2:
    fmt.Println("1か2です")
}
// 出力:
// 1です
// 1か2です

fallthroughはあまり使われない機能である。

3. for文によるループ「繰り返し処理をマスターする」

Goにはforループしかない。whiledo-whileは存在しないが、forで同じことができる。

伝統的なfor文

for i := 0; i < 5; i++ {
    fmt.Println(i)
}
// 出力:
// 0
// 1
// 2
// 3
// 4

構造

  • 初期化: i := 0
  • 条件式: i < 5
  • 後処理: i++

whileスタイルのfor文

count := 0

for count < 3 {
    fmt.Println("カウント:", count)
    count++
}
// 出力:
// カウント: 0
// カウント: 1
// カウント: 2

条件式だけを書くことで、他言語のwhileと同じ動作になる。

無限ループ

i := 0
for {
    fmt.Println(i)
    i++
    
    if i >= 3 {
        break
    }
}
// 出力:
// 0
// 1
// 2

条件を書かないと無限ループになる。breakで抜けることができる。

rangeを使った反復処理

スライス(配列)の要素を順番に処理する場合、rangeが便利である。

fruits := []string{"りんご", "バナナ", "みかん"}

for index, fruit := range fruits {
    fmt.Println(index, "番目:", fruit)
}
// 出力:
// 0 番目: りんご
// 1 番目: バナナ
// 2 番目: みかん

インデックスが不要な場合は_で無視できる。

for _, fruit := range fruits {
    fmt.Println(fruit)
}

4. break と continue「ループの制御」

break

ループを途中で終了させる。

for i := 0; i < 10; i++ {
    if i == 5 {
        break
    }
    fmt.Println(i)
}
// 出力: 0, 1, 2, 3, 4

continue

現在の反復をスキップして次の反復に進む。

for i := 0; i < 5; i++ {
    if i == 2 {
        continue
    }
    fmt.Println(i)
}
// 出力: 0, 1, 3, 4

5. 実践:すべてを組み合わせたプログラム

学んだ内容を使って、簡単な数当てゲームを作ってみよう。

package main

import "fmt"

func main() {
    targetNumber := 7
    
    fmt.Println("=== 数当てゲーム ===")
    fmt.Println("1から10までの数字を当ててください")
    
    for attempt := 1; attempt <= 3; attempt++ {
        fmt.Printf("%d回目の挑戦: ", attempt)
        
        var guess int
        fmt.Scan(&guess)
        
        if guess == targetNumber {
            fmt.Println("正解です!おめでとうございます!")
            break
        } else if guess < targetNumber {
            fmt.Println("もっと大きい数字です")
        } else {
            fmt.Println("もっと小さい数字です")
        }
        
        if attempt == 3 {
            fmt.Println("残念!正解は", targetNumber, "でした")
        }
    }
}

実行例

=== 数当てゲーム ===
1から10までの数字を当ててください
1回目の挑戦: 3
もっと大きい数字です
2回目の挑戦: 5
もっと大きい数字です
3回目の挑戦: 6
もっと大きい数字です
残念!正解は 7 でした

プログラムの解説

  1. targetNumberに正解の数字を設定
  2. forループで3回まで挑戦できる
  3. fmt.Scan()でユーザーの入力を受け取る
  4. if-else if-elseで判定
  5. 正解ならbreakでループを抜ける
  6. 3回目の挑戦で外れたら正解を表示

まとめ

今回学んだ制御構文

  • if文: 条件による分岐処理
  • switch文: 複数の条件をスマートに処理
  • for文: 繰り返し処理(Goにはforしかない)
  • break/continue: ループの制御

これらを組み合わせることで、実用的なプログラムを作成できるようになる。
次のステップとしては、関数の定義方法やエラーハンドリングを学んでいくとよいだろう。

実際に動かしてみよう

この記事のサンプルコードは、私のGitHubリポジトリで公開している。
go-learning/basics/03-control-flow

GitHub Codespacesを使えば、ブラウザ上ですぐに実行できる。

コメント

タイトルとURLをコピーしました