Go言語入門:言語仕様 -Vol.122-

スポンサーリンク
Go言語入門:言語仕様 -Vol.122- 用語解説
Go言語入門:言語仕様 -Vol.122-
この記事は約4分で読めます。
よっしー
よっしー

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

本日は、Go言語の言語仕様について解説しています。

スポンサーリンク

背景

Go言語を学び始めて、公式の「The Go Programming Language Specification(言語仕様書)」を開いてみたものの、「英語で書かれていて読むのが大変…」「専門用語ばかりで何を言っているのかわからない…」と感じたことはありませんか? 実は、多くのGo初心者が同じ壁にぶつかっています。

言語仕様書は、Go言語の「正式な取扱説明書」のような存在です。プログラミング言語がどのように動くのか、どんなルールで書くべきなのかが詳しく書かれていますが、その分、初めて読む人には難しく感じられるのも事実です。

そこでこの記事では、言語仕様書の導入部分を丁寧な日本語訳とともに、初心者の方でも理解しやすい補足説明を加えてお届けします。「強く型付けされている」「ガベージコレクション」「並行プログラミング」といった専門用語も、具体例を交えながらわかりやすく解説していきます。

言語仕様書は難しそうに見えますが、一つひとつの概念を丁寧に読み解いていけば、必ず理解できます。一緒に、Go言語の基礎をしっかり学んでいきましょう!

fallthrough文(Fallthrough statements)

fallthrough 文は、式 switch 文の次のケース節の最初の文に制御を移す。このような節の最後の空でない文としてのみ使用できる。

FallthroughStmt = "fallthrough" .

解説

fallthrough ってなに?

Go の switch は、一致したケースの処理が終わると自動的に switch を抜けます。fallthrough は、あえて次のケースに落とすことを明示的に指示する文です。

switch 3 {
case 3:
    fmt.Println("3")
    fallthrough          // 次のケースに落ちる
case 4:
    fmt.Println("4")     // 3 のときもここが実行される
case 5:
    fmt.Println("5")     // ここには落ちない
}
// 出力:
// 3
// 4

C言語との対比

C言語では break を書き忘れると自動的に次のケースに落ちてしまい、バグの温床でした。Go はこれを逆転させて、デフォルトでは落ちない、明示的に書いたときだけ落ちるという設計にしています。

// C言語:break を忘れるとフォールスルー(バグになりやすい)
// switch (x) {
//     case 1: printf("one");   // break 忘れ → 次に落ちる
//     case 2: printf("two");
// }

// Go:明示的に fallthrough と書かない限り落ちない(安全)
switch x {
case 1:
    fmt.Println("one")   // 自動的にここで止まる
case 2:
    fmt.Println("two")
}

制限事項

1. ケースの最後の文でなければならない

switch x {
case 1:
    fallthrough
    fmt.Println("one")  // コンパイルエラー! fallthrough の後に文がある
case 2:
    fmt.Println("two")
}

2. 式switch でのみ使える(型switch では使えない)

switch v := x.(type) {
case int:
    fallthrough  // コンパイルエラー! 型switch では使えない
case string:
}

3. 次のケースの条件はチェックされない

switch 1 {
case 1:
    fmt.Println("one")
    fallthrough
case 99:
    fmt.Println("ninety-nine")  // 条件に関係なく実行される!
}
// 出力:
// one
// ninety-nine

fallthrough は「次のケースの条件が合っているか」を確認せず、無条件に次のケースの本体に突入します。

実際に使う場面

fallthrough が必要になる場面はかなりまれです。ほとんどの場合、1つの case に複数の値を書くことで代替できます。

// fallthrough を使う(あまり推奨されない)
switch x {
case 1:
    fallthrough
case 2:
    fallthrough
case 3:
    fmt.Println("1, 2, or 3")
}

// 複数の値を case にまとめる(推奨)
switch x {
case 1, 2, 3:
    fmt.Println("1, 2, or 3")
}

fallthrough が本当に必要になるのは、あるケースの処理に加えて、次のケースの処理も実行したいという場面だけです。実際のコードベースではめったに見かけません。

おわりに 

本日は、Go言語の言語仕様について解説しました。

よっしー
よっしー

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

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

コメント

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