概述

相较于支流编程语言,Go 中的 switch 语法更加灵便,它承受任意模式的表达式。

语法规定

  • switch 前面的表达式不须要括号
  • case 语句块执行完会主动退出整个 switch 语句块,也就是不须要应用 break 显式申明
  • case 语句快执行完后,如果心愿持续向下执行,能够应用关键字 fallthrough, 这样就和其余编程语言不加 break 成果一样了
switch expr {   // expr 能够是任意类型  case v1:      ...  case v2:      ...  case v3:      ...  case v4, v5, v6:    // 能够同时测试多个可能符合条件的值      ...  default:  // 默认值      ...}

例子

一般表达式

package mainimport "fmt"func main() {    n := 1024    switch n {    case 1023:        fmt.Println("n = 1023")    case 1024:        fmt.Println("n = 1024")    case 1025:        fmt.Println("n = 1025")    }}// $ go run main.go// 输入如下 /**  n = 1024*/

运算表达式

package mainimport "fmt"func main() {    n := 1024    switch n * 2 {    case 1024:        fmt.Println("n = 1024")    case 2048:        fmt.Println("n = 2048")    case 0:        fmt.Println("n = 0")    }}// $ go run main.go// 输入如下 /**  n = 2048*/

default

package mainimport "fmt"func main() {    n := 1024    switch n * 2 {    case 0:        fmt.Println("n = 0")    case 1:        fmt.Println("n = 1")    case 2:        fmt.Println("n = 2")    default:        fmt.Println("n = 2048")    }}// $ go run main.go// 输入如下 /**  n = 2048*/

省略 expr 表达式

package mainimport "fmt"func main() {    n := 1024    switch {    case n < 1024:        fmt.Println("n < 1024")    case n > 1024:        fmt.Println("n > 1024")    case n == 1024:        fmt.Println("n == 1024")    default:        fmt.Println("invalid n")    }}// $ go run main.go// 输入如下 /**  n = 1024*/

同时测试多个 case

package mainimport "fmt"func main() {    n := 1024    switch n {    case 1023, 1024: // 多个 case, 只有一个匹配就 OK        fmt.Println("n <= 1024")    case 1025:        fmt.Println("n > 1024")    default:        fmt.Println("invalid n")    }}// $ go run main.go// 输入如下 /**  n <= 1024*/

fallthrough

package mainimport "fmt"func main() {    n := 1024    switch {    case n < 1024:        fmt.Println("n < 1024")        fallthrough // 持续向下执行    case n > 1024:        fmt.Println("n > 1024")        fallthrough // 持续向下执行    case n == 1024:        fmt.Println("n == 1024")        fallthrough // 持续向下执行    default:        fmt.Println("invalid n")    }}// $ go run main.go// 输入如下 /**  n = 1024  invalid n*/

类型断言

switch 能够 .(type) 来实现类型断言,判断某个值是否为某个数据类型。

package mainfunc main() {    var n interface{} // 值必须为 interface 类型    n = 1024    switch n.(type) {    case nil:        println("n is a nil")    case int:        println("n is a integer")    case float64:        println("n is a float64")    case bool:        println("n is a bool")    case string:        println("n is a string")    default:        println("n is invalid")    }}// $ go run main.go// 输入如下 /**  n is a integer*/

对于下面代码正文中提到的 interface, 前面会讲到, 读者这里只需晓得关键字 interface 代表接口类型即可。

分割我