
こんにちは。よっしーです(^^)
本日は、Go言語を効果的に使うためのガイドラインについて解説しています。
背景
Go言語を学び始めて、より良いコードを書きたいと思い、Go言語の公式ドキュメント「Effective Go」を知りました。これは、いわば「Goらしいコードの書き方指南書」になります。単に動くコードではなく、効率的で保守性の高いコードを書くためのベストプラクティスが詰まっているので、これを読んだ時の内容を備忘として残しました。
Go言語の制御構造
Go言語の制御構造はC言語のものと関連していますが、重要な違いがあります。
C言語との主な違い
do
やwhile
ループはありません。わずかに一般化されたfor
のみswitch
はより柔軟if
とswitch
はfor
のような初期化文をオプションで受け入れるbreak
とcontinue
文は、何を中断または継続するかを識別するためのオプションのラベルを取る- 新しい制御構造:型スイッチと多方向通信マルチプレクサである
select
構文の違い
- 括弧はありません
- 本体は常に波括弧で区切られなければなりません
Go言語のswitch文
Goのswitch
はC言語のものよりも汎用的です。式は定数である必要がなく、整数である必要もありません。caseは上から下へと評価され、マッチするものが見つかるまで続きます。また、switch
に式がない場合はtrue
でスイッチします。そのため、if
–else
–if
–else
チェーンを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言語を効果的に使うためのガイドラインについて解説しました。

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