switch文は、プログラミングにおいて最も重要な制御フローの一つであり、場合によっては、if-else 構文を改選するために使われます。
本記事では、Golangにおいてswitch文をどのように使用できるかを解説します。
Golangのswitch文とは
switch文はプログラムが異なるcaseに対して異なる処理を与えることができる制御フローのメカニズムです。
switch式と caseブロックで構成され、どんなタイプの変数にも対応できます。
switch文の構文
switch文の構文は比較的簡単です。
switchキーワードを使ってswitchブロックを開始し、次に対象となる値を記述し、そしてブロック内は値にマッチする複数のcaseを記述します。
以下は、switchケースの基本的な構文です。
switch 対象となる値 {
case 条件1: 処理1
case 条件2: 処理2
...
default: 処理3
}
シングルケースのswitch文
Golangのswitch-caseは、case変数をいくつでも持つことができます。
ですが以下では、マッチする値がひとつだけのシンプルなswitch文を例に取ります。
package main
import (
"fmt"
)
func test(v int) {
switch v {
case 10:
fmt.Println("10です")
case 20:
fmt.Println("20です")
default:
fmt.Println("その他です")
}
}
func main() {
test(10) // 10です
test(30) // その他です
}
マルチケースのswitch文
caseブロックでは、複数の値を設定することができます。つまり、いずれかの値が一致すれば、ブロックが実行されるということです。
以下は、マルチケースswitch文のコード例です。
package main
import (
"fmt"
)
func test(v string) {
switch v {
case "Tanaka":
fmt.Println("先生です")
case "Sato", "Kato", "Yoshida":
fmt.Println("生徒です")
}
}
func main() {
test("Tanaka") // 先生です
test("Kato") // 生徒です
}
breakキーワードの使い方
switchブロックでは、ブロック全体から抜けるためにbreakキーワードを使用することができます。
ケースを完全に実行したくない時に、breakキーワードを使うだけで、そのブロックから抜けることができます。
以下は、breakキーワードを実際に使用したコード例です。
package main
import (
"fmt"
)
func test(v int) {
switch v {
case 1:
fmt.Println("1です")
case 2:
fmt.Println("2です")
break
default:
fmt.Println("それ以外です")
}
}
func main() {
test(10) // それ以外です
test(2) // 2です
}
fallthroughキーワード
Goには、実行を次のケースに渡すためのfallthroughキーワードがあります。
fallthroughキーワードは、現在のcaseにおいてこれ以上進めない状況で、次のcase内の処理を強制的に実行する時に使用します。
fallthroughキーワードは以下のように使用します。
package main
import (
"fmt"
)
func test(i int) {
switch i {
case 2:
fmt.Println("2")
case 4:
fmt.Println("4")
fallthrough
case 8:
fmt.Println("8")
}
}
func main() {
test(4) // 4
// 8
}
switch文と変数の初期化
Goのswitch文は、先に変数を宣言しておいて、同時にそれを使うことができます。これはオプションの文ですが、かなり便利な機能です。ここでは、switch文で変数を初期化する方法を示します。
package main
import (
"fmt"
)
func main() {
switch i := 3; i {
case 1:
break
case 2:
fallthrough
case 3:
fmt.Println("3です")
}
}
// 出力結果 3です
i := 3 の部分で変数iを初期化し、そのままswitch文で使用してますね。
switch文にあらかじめ宣言された変数
前に宣言した変数もswitch文の中で使うことができます。case宣言の時点でチェックすれば、switchキーワードの後に式を置く必要はありません。
もしくは、switchキーワードの後にその変数を使って、通常のswitchケースとして使用することもできます。
以下は両者のコード例です。
package main
import (
"fmt"
)
func main() {
var name string = "Tanaka"
// あらかじめswitch文に変数がある場合
switch name {
case "Tanaka": // just check the value
fmt.Println("Hi, Tanaka!")
default:
fmt.Println("Hi, user!")
}
// swich文に変数がない場合
switch {
case name == "Tanaka": // check the case here
fmt.Println("Hi, Tanaka!")
default:
fmt.Println("Hi, user!")
}
// 上記のどちらでも動作は同じ
}
条件付きcase文
Golangのスイッチ文は、caseに条件を指定することができます。条件が一致した時にブロック内の処理が実行されるということです。
以下は、caseの中で条件式を使用するコード例です。
package main
import (
"fmt"
)
func main() {
var i int = 10
switch {
case i < 5:
fmt.Println("5未満")
case i < 10:
fmt.Println("10未満")
case i < 15:
fmt.Println("15未満")
default:
fmt.Println("15以上")
}
}
// 出力結果: 15未満
defaultケースについて
デフォルトケースは、その名の通り、他のどの値にも一致しない場合に実行されるブロックです。
以下は、defaultケースを使ったコード例です。
package main
import (
"fmt"
)
func main() {
var i int = 30
switch i {
case 1:
fmt.Println("One!")
case 2:
fmt.Println("Two!")
case 3:
fmt.Println("Three!")
default:
fmt.Println("Error!")
}
}
// 出力結果: Error!
Golangの型switchについて
Golangには、switch文の中で値の代わりに型を使用できる型switchがあります。
型switchブロックの式では、interfaceのみ使用可能です。
型switchについては、以下の記事でコード例を交えて詳しく説明しています。
Golangのswitch文のメリットとは
switch文は、if-elseブロックの代わりとして使用することができます。
if-elseブロックを使っていると冗長になることがあり、そんな時switch文を使うことで、綺麗ですっきりとしたコードを書くことができます。