Golangでswitch文を使用する方法を具体例で解説!

Golang

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文を使うことで、綺麗ですっきりとしたコードを書くことができます。

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