# 条件控制/Switch

switch 用于多条件时,更好地控制逻辑分支。

# 用法

switch 搭配 case 实现可读性更好的条件控制,其中 default 分类是默认分支。但所有条件都不符合时,会进入默认分支。

swicth ext {
  case "a":
    // ...
  case "b":
    // ...
  case "c":
    // ...
  default:
    // ...
}

# 执行顺序

swicth 语法中的 case 执行顺序为从上往下,直到匹配条件为止。如果所有 case 都不符合,就会进入 default。 注意!default 的特殊条件,无论写在什么顺序,都会把所有 case 跑完之后再匹配 defualt

# 条件表达式的类型

Go 中 switch 语句各表达式的求值结果可以为各种类型值,只要它的类型支持比较操作就 可以了。比如整型、布尔类型、字符串类型、复数类型、元素类型都是可比较类型的数组类型,甚至字段类型都是可比较类型的结构体类型,也可以。下面就是一个使用自定义结构 体类型作为 switch 表达式类型的例子:

type person struct{
  name string
  age int
}
func main(){
  p:=person{"tom",13}
  switch p{
    case person{"tony",33}:
      println("matchtony")
    case person{"tom",13}:
      println("matchtom")
    case person{"lucy",23}:
      println("matchlucy")
    default:
      println("nomatch")
  }
}

如果求值结果始终为 true,那么我们甚至 可以省略 switch 后面的表达式,比如下面例子:

//没有initStmt语句的switch语句
switch {
  case bool_expr1:
  case bool_expr2:
  //......
}

# 条件语句支持列表

Go 中可以让几个不同的条件执行相同的逻辑。

func checkWorkday(aint){
  switch a{
    case 1,2,3,4,5:
        // 符合 1,2,3,4,5都会执行这里
    case 6,7:
        // 符合 6,7 都会执行这里
    default:
        // ...
  }
}

# fallthrough

在 C 语言中,我们需要显式调用break来阻止代码执行完当前case之后执行下一个case。但在 Go 默认是不会执行下一个case的。但是如果开发者需要程序可以执行多个case,就要用到 fallthrough 关键字了。

swicth ext{
  case ext1:
    // 满足ext1后执行
    fallthrough
  case ext2:
    // 满足ext2后执行
    fallthrough
  default:
    // ...
}

# type swicth

type swicth 是一种特殊用法,可以用于判断变量的类型。

func main(){
  var xinterface{}=13 
  switch x.(type){
    case nil:
      println("xisnil")
    case int:
      println("thetypeofxisint")
    case string:
      println("thetypeofxisstring")
    case bool:
      println("thetypeofxisstring")
    default:
      println("don'tsupportthetype")
  }
}

switch 关键字后面跟着的表达式为 x. ( type) , 这种表达式形式是 switch 语句专有的,而 且也只能在 switch 语句中使用。 这个表达式中的 x 必须是一个接口类型变量 , 表达式的求 值结果是这个接口类型变量对应的动态类型。

通过 x. (type) , 我们除了可以获得变量 x 的动态类型信息之外,也能获得其动态 类型对应的值信息,现在我们把上面的例子改造一下:

func main(){
  var x interface{}=13
  switch v:=x.(type){
    case nil:
      println("v is nil")
    case int:
      println("the type of v is int,v=",v)
    case string:
      println("the type of v is string,v=",v)
    case bool:
      println("the type of v is bool,v=",v)
    default:
      println("don't support the type")
  }
}

这里v 存储的是变量 x 的动态类型对应的值信息