前回で、変数宣言やデータ型、基本的な出力方法を学んだ方に向けて、今回は制御構文をご紹介しよう。
制御構文を理解することで、プログラムに「判断」と「繰り返し」の機能を持たせることができる。これにより、より実用的なプログラムを作成できるようになる。
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ループしかない。whileやdo-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, 4continue
現在の反復をスキップして次の反復に進む。
for i := 0; i < 5; i++ {
if i == 2 {
continue
}
fmt.Println(i)
}
// 出力: 0, 1, 3, 45. 実践:すべてを組み合わせたプログラム
学んだ内容を使って、簡単な数当てゲームを作ってみよう。
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 でしたプログラムの解説
targetNumberに正解の数字を設定forループで3回まで挑戦できるfmt.Scan()でユーザーの入力を受け取るif-else if-elseで判定- 正解なら
breakでループを抜ける - 3回目の挑戦で外れたら正解を表示
まとめ
今回学んだ制御構文
- if文: 条件による分岐処理
- switch文: 複数の条件をスマートに処理
- for文: 繰り返し処理(Goにはforしかない)
- break/continue: ループの制御
これらを組み合わせることで、実用的なプログラムを作成できるようになる。
次のステップとしては、関数の定義方法やエラーハンドリングを学んでいくとよいだろう。
実際に動かしてみよう
この記事のサンプルコードは、私のGitHubリポジトリで公開している。
→ go-learning/basics/03-control-flow
GitHub Codespacesを使えば、ブラウザ上ですぐに実行できる。



コメント