Go言語で条件分岐を書く時、いつもif
文ばかり使っていませんか?
実は、もっと読みやすく、効率的に分岐処理を行うには「switch
文」がとても便利です。
Goのswitch
は、他のプログラミング言語とは違う特徴がたくさんあります。
正しく使うことで、コードがとてもシンプルになり、読む人にとってもわかりやすくなります。
この記事では、プログラミング初心者でも理解できるように、Go言語のswitch
文について基本から応用まで、具体例をたくさん使って説明します。
「if
文しか知らない」という人も、この記事を読めばswitch
文の便利さがよくわかるはずです。
Goのswitch文ってなに?

switch文は条件分岐をきれいに書ける仕組み
switch
文は、たくさんの条件を整理して書ける分岐の仕組みです。
「もし○○だったら△△する」という処理を、すっきりとまとめて書くことができます。
他の言語(C言語やJavaなど)を知っている人は驚くかもしれませんが、Goではbreak
という命令を書かなくても、自動的に処理が終わってくれます。これがGoのswitch
文の大きな特徴です。
基本的な書き方を見てみよう
説明 まずは、一番シンプルなswitch
文の例を見てみましょう。
例
x := 2
switch x {
case 1:
fmt.Println("一")
case 2:
fmt.Println("二")
case 3:
fmt.Println("三")
default:
fmt.Println("その他の数字")
}
// 結果:「二」が表示される
この例では、変数x
の値によって、表示される内容が変わります。x
が2なので、「二」が表示されます。
if文と比較してみよう
同じ処理をif
文で書くと、こうなります:
x := 2
if x == 1 {
fmt.Println("一")
} else if x == 2 {
fmt.Println("二")
} else if x == 3 {
fmt.Println("三")
} else {
fmt.Println("その他の数字")
}
switch
文の方が、見た目がすっきりしていて読みやすいですね。
Goのswitch
文は、構文がシンプルで読みやすいのが特長です。では、もう少し詳しい使い方を見ていきましょう。
基本的な使い方と便利なルール
複数の条件をまとめて書ける
Goのswitch
文では、一つのcase
に複数の条件をカンマ(,)で区切って書くことができます。これはとても便利な機能です。
説明 例えば、「土曜日と日曜日は週末」のように、複数の値を同じ処理にまとめたい時に使えます。
例
day := "土曜日"
switch day {
case "土曜日", "日曜日":
fmt.Println("今日は週末です!ゆっくり休みましょう")
case "月曜日":
fmt.Println("新しい一週間の始まりです")
case "火曜日", "水曜日", "木曜日", "金曜日":
fmt.Println("今日は平日です")
default:
fmt.Println("正しい曜日を入力してください")
}
defaultは「その他の場合」
default
は、どのcase
にも当てはまらない時に実行されます。if
文の最後のelse
と同じ役割です。
説明 default
は必ず書く必要はありませんが、予想外の値が来た時の処理として書いておくと安全です。
例
grade := "B+"
switch grade {
case "A", "A+":
fmt.Println("素晴らしい成績です!")
case "B", "B+":
fmt.Println("良い成績です")
case "C":
fmt.Println("普通の成績です")
default:
fmt.Println("成績を確認してください") // F や無効な値の場合
}
変数を宣言しながら使える
switch
文では、判定する変数をその場で作ることもできます。
例
switch num := calculateScore(); num {
case 100:
fmt.Println("満点です!")
case 80, 90:
fmt.Println("高得点です")
default:
fmt.Printf("点数は%d点です\n", num)
}
// 注意:変数numは、switch文の外では使えません
複数の条件を1つにまとめられるので、if-else
よりもずっと簡潔に書けます。次は、さらに便利な応用テクニックを紹介します。
応用テクニック|条件なしswitchとfallthrough

条件なしswitchで複雑な判定
switch
の後に変数を書かない「条件なしswitch」という使い方があります。これを使うと、複雑な条件でも読みやすく書けます。
説明 条件なしswitchでは、各case
でtrue
かfalse
かを判定します。複雑な条件分岐を整理したい時にとても便利です。
例
score := 85
attendance := 90 // 出席率
switch {
case score >= 90 && attendance >= 95:
fmt.Println("最優秀賞です!")
case score >= 80 && attendance >= 90:
fmt.Println("優秀賞です")
case score >= 70:
fmt.Println("合格です")
case score >= 60:
fmt.Println("ぎりぎり合格です")
default:
fmt.Println("不合格です。頑張りましょう")
}
年齢による分類の例
例
age := 25
switch {
case age < 0:
fmt.Println("正しい年齢を入力してください")
case age < 13:
fmt.Println("お子様料金が適用されます")
case age < 18:
fmt.Println("学生料金が適用されます")
case age < 65:
fmt.Println("大人料金です")
default:
fmt.Println("シニア料金が適用されます")
}
fallthroughで次の処理も実行
通常、Goのswitch
文では、条件に合ったcase
の処理が終わると、自動的にswitch
文を抜けます。でも、次のcase
の処理も続けて実行したい時は、fallthrough
というキーワードを使います。
説明 fallthrough
を使うと、次のcase
の処理も実行されます。ただし、使いすぎるとコードが読みにくくなるので、本当に必要な時だけ使いましょう。
例
month := 12
switch month {
case 12:
fmt.Println("年末です")
fallthrough // 次のcaseも実行
case 1, 2:
fmt.Println("寒い季節です")
case 6, 7, 8:
fmt.Println("暑い季節です")
default:
fmt.Println("普通の季節です")
}
// 結果:
// 年末です
// 寒い季節です
処理の流れを制御する例
例
level := 3
switch level {
case 3:
fmt.Println("レベル3の処理を実行")
fallthrough
case 2:
fmt.Println("レベル2の処理を実行")
fallthrough
case 1:
fmt.Println("レベル1の処理を実行")
default:
fmt.Println("基本処理を実行")
}
条件なしswitch
やfallthrough
を使えば、より柔軟な条件分岐ができるようになります。次は、実際の開発現場でよく使われる例を見てみましょう。
実際の開発での活用例
関数の戻り値として使う
switch
文は、関数の中で戻り値を決める時にもよく使われます。
説明 年齢によってカテゴリを分ける関数を作ってみましょう。条件なしswitchを使うことで、複雑な条件でも読みやすく書けます。
例
func categorizeByAge(age int) string {
switch {
case age < 0:
return "無効な年齢"
case age < 13:
return "子ども"
case age < 18:
return "中高生"
case age < 20:
return "大学生"
case age < 65:
return "大人"
default:
return "シニア"
}
}
// 使い方
fmt.Println(categorizeByAge(16)) // "中高生"
fmt.Println(categorizeByAge(30)) // "大人"
HTTPステータスコードの処理
Webアプリケーション開発では、HTTPステータスコードによって処理を分ける場面がよくあります。
例
func handleResponse(statusCode int) {
switch statusCode {
case 200:
fmt.Println("リクエストが成功しました")
case 404:
fmt.Println("ページが見つかりません")
case 500, 502, 503:
fmt.Println("サーバーでエラーが発生しました")
case 401, 403:
fmt.Println("アクセス権限がありません")
default:
fmt.Printf("予期しないステータスコード: %d\n", statusCode)
}
}
エラーハンドリングでの活用
Goでは、エラーの種類によって処理を分けることがよくあります。
説明 エラーの型によって、適切な対応を選択する例です。型アサーション(型の確認)と組み合わせて使います。
例
import (
"errors"
"fmt"
"os"
)
func handleError(err error) {
switch err {
case nil:
fmt.Println("エラーはありません")
default:
// エラーの種類をチェック
switch {
case errors.Is(err, os.ErrNotExist):
fmt.Println("ファイルが存在しません")
case errors.Is(err, os.ErrPermission):
fmt.Println("ファイルにアクセスする権限がありません")
default:
fmt.Printf("予期しないエラー: %v\n", err)
}
}
}
曜日による営業時間の表示
例
func getBusinessHours(dayOfWeek string) string {
switch dayOfWeek {
case "月曜日", "火曜日", "水曜日", "木曜日", "金曜日":
return "営業時間: 9:00-18:00"
case "土曜日":
return "営業時間: 10:00-17:00"
case "日曜日":
return "定休日"
default:
return "正しい曜日を入力してください"
}
}
fmt.Println(getBusinessHours("土曜日")) // "営業時間: 10:00-17:00"
ゲームのスコア判定
例
func getGrade(score int) (string, string) {
var grade, comment string
switch {
case score >= 95:
grade = "S"
comment = "素晴らしい!"
case score >= 85:
grade = "A"
comment = "とても良い"
case score >= 75:
grade = "B"
comment = "良い"
case score >= 65:
grade = "C"
comment = "普通"
default:
grade = "D"
comment = "もう少し頑張ろう"
}
return grade, comment
}
grade, comment := getGrade(88)
fmt.Printf("成績: %s (%s)\n", grade, comment) // "成績: A (とても良い)"
実際の開発での活用例を見ることで、switch文がいろいろな場面で役立つことがわかったのではないでしょうか。最後に、この記事の大切なポイントをまとめます。
まとめ
Goのswitch
文は、他のプログラミング言語に比べて、とてもシンプルで使いやすい仕組みです。
覚えておきたいポイント
基本的な特徴
break
を書かなくても自動的に処理が終わる- 複数の条件をカンマで区切って書ける
default
で予期しない値への対応ができる
便利な応用テクニック
- 条件なしswitchで複雑な判定ができる
fallthrough
で次の処理も続けて実行できる- 関数の戻り値決定にも使える
実際の開発での活用場面
- HTTPステータスコードの処理
- エラーハンドリング
- 年齢や点数による分類
- 曜日による処理の切り替え
コメント