Go 速習チュートリアル

Go 言語の switch 文

1. switch ステートメント

switch ステートメントを使用すると、多数のコードブロックの中から実行する1つを選択できます。

Go言語の switch ステートメントは、C、C++、Java、JavaScript、PHPなどの言語と似ていますが、大きな違いがあります。Goでは一致した case のみが実行されるため、各ブロックの末尾に break ステートメントを記述する必要がありません。

2. 単一ケースの switch シンタックス

基本的な構文は以下の通りです。

switch expression {
case x:
   // コードブロック
case y:
   // コードブロック
case z:
...
default:
   // コードブロック
}

3. 動作原理

switch 文は以下のステップで処理されます:

  • エクスプレッション(式)が一度だけ評価されます。
  • switch エクスプレッションの値と、各 case の値が比較されます。
  • 値が一致(マッチ)した場合、関連付けられたコードブロックが実行されます。
  • default キーワードは任意(オプション)です。どの case にも一致しなかった場合に実行するコードを指定します。

4. 単一ケースの switch 実装例

以下の例では、曜日の数値を基に曜日の名前を算出しています。

package main
import ("fmt")

func main() {
  day := 4

  switch day {
  case 1:
    fmt.Println("月曜日")
  case 2:
    fmt.Println("火曜日")
  case 3:
    fmt.Println("水曜日")
  case 4:
    fmt.Println("木曜日")
  case 5:
    fmt.Println("金曜日")
  case 6:
    fmt.Println("土曜日")
  case 7:
    fmt.Println("日曜日")
  }
}

実行結果:

木曜日

5. default キーワード

default キーワードを使用すると、どのケースにも一致しなかった場合に実行されるコードを定義できます。

package main
import ("fmt")

func main() {
  day := 8

  switch day {
  case 1:
    fmt.Println("月曜日")
  case 2:
    fmt.Println("火曜日")
  case 3:
    fmt.Println("水曜日")
  case 4:
    fmt.Println("木曜日")
  case 5:
    fmt.Println("金曜日")
  case 6:
    fmt.Println("土曜日")
  case 7:
    fmt.Println("日曜日")
  default:
    fmt.Println("有効な曜日ではありません")
  }
}

実行結果:

有効な曜日ではありません

6. 型の一致に関する注意点

すべての case の値は、switch エクスプレッションと同じ**型(データタイプ)**である必要があります。型が異なる場合、コンパイラはエラーを発生させます。

6.1. エラーが発生する例

package main
import ("fmt")

func main() {
  a := 3

  switch a {
  case 1:
    fmt.Println("aは1です")
  case "b":
    fmt.Println("aはbです")
  }
}

実行結果:

./prog.go:11:2: cannot use "b" (type untyped string) as type int