golangの日記

Go言語を中心にプログラミングについてのブログ

Go言語(golang) switch文の書き方

golang.png


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)
}