【初心者向け】Go言語のswitch文の使い方完全ガイド|if文よりスマートに条件分岐!

Go

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では、各casetruefalseかを判定します。複雑な条件分岐を整理したい時にとても便利です。

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("基本処理を実行")
}

条件なしswitchfallthroughを使えば、より柔軟な条件分岐ができるようになります。次は、実際の開発現場でよく使われる例を見てみましょう。

実際の開発での活用例

関数の戻り値として使う

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ステータスコードの処理
  • エラーハンドリング
  • 年齢や点数による分類
  • 曜日による処理の切り替え

コメント

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