このセクションではswitch
文を見ていきます。制御構造の一部です。
プログラムはデフォルトではシーケンシャルに動作します。しかし、for
を使って繰り返しをしたり、if
やswitch
を使って条件を用いて制御することができます。
switch
文はつねにswitch
というキーワードから始まります。「何かのスイッチを入れる」みたいにとらえると良いと思います。
swtich
キーワードに加えて、switch
文にはcase
があります。switch
文にはいくつかcase
があります。
package main
import (
"fmt"
)
func main() {
switch {
case false:
fmt.Println("出力されない")
case (2 == 4):
fmt.Println("出力されない2")
case (3 == 3):
fmt.Println("出力される")
case (4 == 4):
fmt.Println("これも真だけど出力されるかな?")
}
}
上の例では、最初に真となるcase
は3 == 3
なので、fmt.Println("出力される")
が実行されます。Goのswitch文のデフォルトではフォールスロー(fallthrough
)がされません。これにより、4 == 4
のcase
は実行されません。fallthrough
を記述してどうなるか見てみましょう。
package main
import (
"fmt"
)
func main() {
switch {
case false:
fmt.Println("出力されない")
case (2 == 4):
fmt.Println("出力されない2")
case (3 == 3):
fmt.Println("出力される")
fallthrough
case (4 == 4):
fmt.Println("これも真だけど出力されるかな?")
}
}
fallthrough
を記述したことにより、最後の4==4
も実行されました。fallthrough
を使えば各文を評価させることができるようになります。
package main
import (
"fmt"
)
func main() {
switch {
case false:
fmt.Println("出力されない")
case (2 == 4):
fmt.Println("出力されない2")
case (3 == 3):
fmt.Println("出力される")
fallthrough
case (4 == 4):
fmt.Println("これも真だけど出力されるかな?")
fallthrough
case (7 == 9):
fmt.Println("真でない1")
fallthrough
case (11 == 14):
fmt.Println("真でない2")
fallthrough
case (15 == 15):
fmt.Println("真15")
}
}
しかし、一般的に言ってfallthrough
は使わないほうが良いでしょう。
他に真となるcase
がなかったときに評価されるdefault
もあります。
package main
import (
"fmt"
)
func main() {
switch {
case false:
fmt.Println("this should not print")
case (2 == 4):
fmt.Println("this should not print2")
default:
fmt.Println("this is default")
}
}
なんらかの値とともにswitch
文を始めたときは、その値と等しいかを評価します。
package main
import (
"fmt"
)
func main() {
switch "Bond" {
case "Moneypenny":
fmt.Println("miss money")
case "Bond":
fmt.Println("bond james")
case "Q":
fmt.Println("This is q")
default:
fmt.Println("this is default")
}
}
switch
文にハードコードするより、変数を使ったほうが良いでしょう。
package main
import (
"fmt"
)
func main() {
n := "Bond"
switch n {
case "Moneypenny":
fmt.Println("miss money")
case "Bond":
fmt.Println("bond james")
case "Q":
fmt.Println("This is q")
default:
fmt.Println("this is default")
}
}
case
に複数の値を書くこともできます。
package main
import (
"fmt"
)
func main() {
n := "Bond"
switch n {
case "Moneypenny", "Bond", "Dr No":
fmt.Println("miss money or bond or dr no")
case "M":
fmt.Println("m")
case "Q":
fmt.Println("This is q")
default:
fmt.Println("this is default")
}
}