Go言語(golang) switch文の書き方
go言語(golang)の switch 文の基本的な使い方と型(type)判定
switch 文は if 文と同様に条件により処理を振り分けることができる。
基本的な使い方
- 以下の場合、
n is 1
が出力されます。case ステートメントはいくつでも書くことができる。
C言語や JavaScript などのように case ステートメントの終わりに break; を書く必要はない。
n := 1 switch n { case 3: fmt.Println("n is", n) case 2: fmt.Println("n is", n) case 1: fmt.Println("n is", n) }
- 型が異なる場合も同じ(以下 string型)
s := "foo" switch s { case "foo": fmt.Println("s:", s) case "bar": fmt.Println("s:", s) case "baz": fmt.Println("s:", s) }
- case は、「 , 」区切りで複数にマッチさせることができる。
n := 5 switch n { case 4, 5, 6: fmt.Println("n:", n) case 1, 2, 3: fmt.Println("n:", n) }
- default を使って、どの case にも当てはまらない場合の処理を書くことができる
n := 0 switch n { case 3: fmt.Println("n is", n) case 2: fmt.Println("n is", n) case 1: fmt.Println("n is", n) default: fmt.Println("n is less than 1") }
- if 文のように条件式を書くことができる。
この場合switch {
のように何も指定しない。
n := 80 switch { case n >= 0 && n <= 50: fmt.Println("n =", n, "(0 ~ 50)") case n > 50 && n <= 100: fmt.Println("n =", n, "(50 ~ 100)") }
- expression 部分に boolean型 を指定する。
true を指定した場合は最初に true だった条件式にマッチする。
false を指定した場合は最初に false だった条件式にマッチする
package main func main() { switch true { case 1 == 1: // 最初に true となる条件式 println(1) // 1 case 2 == 1: println(2) default: println(3) } switch false { case 1 == 1: println(1) case 2 == 1: // 最初に false になる条件式 println(2) // 2 default: println(3) } }
- fallthrough
以下の例では、n が 3 の場合にのみ n に 100 を掛ける。
その後に fallthrough でcase 2:
へと移るので
fmt.Println(n)
が実行され 300 が出力される。
n := 3 switch n { case 3: n *= 100 fallthrough case 2: fmt.Println(n) case 1: fmt.Println(n*10) } // 本来は「 case 3, 2: 」とカンマ区切りで記述するところを 3 の場合には別の処理(n *= 100)が必要。 // しかし、その他の処理は「 case 2: 」と同じというような場合に使う。 // カンマ区切りで書いた場合は以下のように、更に条件分岐が必要になるため n := 3 switch n { case 3, 2: if n == 3 { n *= 100 } fmt.Println(n) case 1: fmt.Println(n*10) }
- 関数内でスイッチ文を使っている場合、default を書いていれば
確実に、どれかに当てはまるので return を関数の最後に記述する必要はない
func fn(n int) int { switch n { case 3, 2, 1: return n * 100 default: return n } // ここに return n と書かなくて良い。省略できる } func main() { n := fn(1) fmt.Println(n) }
switch 文を使って型(type)判定
当然ですが、v.(type)
は、インターフェースにしか、使えません。
v := interface{}("hello") switch v.(type) { case string: fmt.Println(v.(string) + " world") case int, int32, int64: fmt.Println(v.(int) * 100) }