Go言語入門:効果的なGo -制御構造:Switch文-

スポンサーリンク
Go言語入門:効果的なGo -制御構造:Switch文- ノウハウ
Go言語入門:効果的なGo -制御構造:Switch文-
この記事は約5分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

本日は、Go言語を効果的に使うためのガイドラインについて解説しています。

スポンサーリンク

背景

Go言語を学び始めて、より良いコードを書きたいと思い、Go言語の公式ドキュメント「Effective Go」を知りました。これは、いわば「Goらしいコードの書き方指南書」になります。単に動くコードではなく、効率的で保守性の高いコードを書くためのベストプラクティスが詰まっているので、これを読んだ時の内容を備忘として残しました。

Go言語の制御構造

Go言語の制御構造はC言語のものと関連していますが、重要な違いがあります。

C言語との主な違い

  • dowhileループはありません。わずかに一般化されたforのみ
  • switchはより柔軟
  • ifswitchforのような初期化文をオプションで受け入れる
  • breakcontinue文は、何を中断または継続するかを識別するためのオプションのラベルを取る
  • 新しい制御構造:型スイッチと多方向通信マルチプレクサであるselect

構文の違い

  • 括弧はありません
  • 本体は常に波括弧で区切られなければなりません

Go言語のswitch文

GoのswitchはC言語のものよりも汎用的です。式は定数である必要がなく、整数である必要もありません。caseは上から下へと評価され、マッチするものが見つかるまで続きます。また、switchに式がない場合はtrueでスイッチします。そのため、ifelseifelseチェーンをswitchとして書くことが可能であり、慣用的でもあります。

自動的なfall through(次のcaseへの流れ込み)はありませんが、caseはコンマ区切りのリストで提示できます。

Goでは他のC系言語ほど一般的ではありませんが、break文を使ってswitchを早期に終了させることができます。しかし時には、switchではなく、それを囲むループから抜け出す必要があります。Goでは、ループにラベルを付けて、そのラベルに向かって”break”することでこれを実現できます。

もちろん、continue文もオプションでラベルを受け取りますが、これはループにのみ適用されます。

解説

1. Goのswitchの特徴

C言語との違い:

  • 式の制限なし: C言語では整数定数のみですが、Goでは任意の型の式を使用可能
  • 自動fall throughなし: C言語では明示的にbreakを書かないと次のcaseに流れ込みますが、Goでは自動的に終了

2. コード例の解説

unhex関数:

func unhex(c byte) byte {
    switch {  // 式なし = switch true と同じ
    case '0' <= c && c <= '9':
        return c - '0'
    case 'a' <= c && c <= 'f':
        return c - 'a' + 10
    case 'A' <= c && c <= 'F':
        return c - 'A' + 10
    }
    return 0
}

この関数は16進文字を数値に変換します。switchに式がないため、各caseの条件式がtrueと比較されます。

shouldEscape関数:

func shouldEscape(c byte) bool {
    switch c {
    case ' ', '?', '&', '=', '#', '+', '%':  // 複数値をカンマ区切り
        return true
    }
    return false
}

1つのcaseで複数の値をチェックできます。

ラベル付きbreak:

Loop:
    for n := 0; n < len(src); n += size {
        switch {
        case src[n] < sizeOne:
            if validateOnly {
                break  // switchから抜ける
            }
            // ...
        case src[n] < sizeTwo:
            if n+1 >= len(src) {
                err = errShortInput
                break Loop  // ラベル付きループから抜ける
            }
            // ...
        }
    }

break Loopにより、switchではなく外側のforループから抜け出せます。

Compare関数: バイトスライスを辞書順で比較する関数です。2つのswitch文を使って効率的に比較処理を行っています。

3. Goのswitchの利点

  • 可読性: 複雑なif-elseチェーンより読みやすい
  • 柔軟性: 任意の型・式を使用可能
  • 安全性: 自動fall throughがないためバグが起きにくい
  • 効率性: コンパイラによる最適化が可能

このようにGoのswitch文は、C言語よりもはるかに表現力豊かで安全な制御構造となっています。

おわりに 

本日は、Go言語を効果的に使うためのガイドラインについて解説しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

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