• Go语言基础之流程控制switch分支


    Go语言基础之流程控制switch分支

    一、switch case

    switch 是一个条件语句,用于将表达式的值与可能匹配的选项列表进行比较,并根据匹配情况执行相应的代码块。它可以被认为是替代多个 if else 子句的常用方式。

    使用switch语句可方便地对大量的值进行条件判断。

    switch statement; condition {
        case 表达式1:
            fmt.Println("表达式1")
        case 表达式2:
            fmt.Println("表达式2")
        case 表达式3:
            fmt.Println("表达式3")
            fallthrough
        case 表达式4:
            fmt.Println("表达式4")
        case 表达式5:
            fmt.Println("表达式5")
         default:
      		fmt.Println("当上面条件不匹配,执行我")
    }
    

    看代码比文字更容易理解。让我们从一个简单的例子开始,它将把一个手指的编号作为输入,然后输出该手指对应的名字。比如 0 是拇指,1 是食指等等。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        finger := 4
        switch finger {
        case 1:
            fmt.Println("Thumb")
        case 2:
            fmt.Println("Index")
        case 3:
            fmt.Println("Middle")
        case 4:
            fmt.Println("Ring")
        case 4://重复项
            fmt.Println("Another Ring")
        case 5:
            fmt.Println("Pinky")
    
        }
    }
    

    在上述程序中,switch fingerfinger 的值与每个 case 语句进行比较。通过从上到下对每一个值进行对比,并执行与选项值匹配的第一个逻辑。在上述样例中, finger 值为 4,因此打印的结果是 Ring

    在选项列表中,case 不允许出现重复项。如果您尝试运行下面的程序,编译器会报这样的错误: main.go:18:2:在tmp / sandbox887814166 / main.go:16:7

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        finger := 4
        switch finger {
        case 1:
            fmt.Println("Thumb")
        case 2:
            fmt.Println("Index")
        case 3:
            fmt.Println("Middle")
        case 4:
            fmt.Println("Ring")
        case 4://重复项
            fmt.Println("Another Ring")
        case 5:
            fmt.Println("Pinky")
        }
    }
    

    二、default默认分支

    Go语言规定每个switch只能有一个default分支。

    我们每个人一只手只有 5 个手指。如果我们输入了不正确的手指编号会发生什么?这个时候就应该是属于默认情况。当其他情况都不匹配时,将运行默认情况。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        switch finger := 8; finger {
        case 1:
            fmt.Println("Thumb")
        case 2:
            fmt.Println("Index")
        case 3:
            fmt.Println("Middle")
        case 4:
            fmt.Println("Ring")
        case 5:
            fmt.Println("Pinky")
        default: // 默认情况
            fmt.Println("incorrect finger number")
        }
    }
    

    在上述程序中 finger 的值是 8,它不符合其中任何情况,因此会打印 incorrect finger number。default 不一定只能出现在 switch 语句的最后,它可以放在 switch 语句的任何地方。

    您可能也注意到我们稍微改变了 finger 变量的声明方式。finger 声明在了 switch 语句内。在表达式求值之前,switch 可以选择先执行一个语句。在这行 switch finger:= 8; finger 中, 先声明了finger 变量,随即在表达式中使用了它。在这里,finger 变量的作用域仅限于这个 switch 内。

    三、多表达式判断

    一个分支可以有多个值,多个case值中间使用英文逗号分隔。

    func testSwitch3() {
        switch n := 7; n {
        case 1, 3, 5, 7, 9:
            fmt.Println("奇数")
        case 2, 4, 6, 8:
            fmt.Println("偶数")
        default:
            fmt.Println(n)
        }
    }
    

    分支还可以使用表达式,这时候switch语句后面不需要再跟判断变量。例如:

    func switchDemo4() {
        age := 30
        switch {
        case age < 25:
            fmt.Println("好好学习吧")
        case age > 25 && age < 35:
            fmt.Println("好好工作吧")
        case age > 60:
            fmt.Println("好好享受吧")
        default:
            fmt.Println("活着真好")
        }
    }
    

    四、无表达式的 switch

    在 switch 语句中,表达式是可选的,可以被省略。如果省略表达式,则表示这个 switch 语句等同于 switch true,并且每个 case 表达式都被认定为有效,相应的代码块也会被执行。

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        num := 75
        switch { // 表达式被省略了
        case num >= 0 && num <= 50:
            fmt.Println("num is greater than 0 and less than 50")
        case num >= 51 && num <= 100:
            fmt.Println("num is greater than 51 and less than 100")
        case num >= 101:
            fmt.Println("num is greater than 100")
        }
    
    }
    

    在上述代码中,switch 中缺少表达式,因此默认它为 true,true 值会和每一个 case 的求值结果进行匹配。case num >= 51 && <= 100: 为 true,所以程序输出 num is greater than 51 and less than 100。这种类型的 switch 语句可以替代多个 if else 子句。

    五、Fallthrough 语句

    在 Go 中,每执行完一个 case 后,会从 switch 语句中跳出来,不再做后续 case 的判断和执行。使用 fallthrough 语句可以在已经执行完成的 case 之后,把控制权转移到下一个 case 的执行代码中。

    fallthrough 语法可以执行满足条件的case的下一个case,无条件执行下一个case(穿透)是为了兼容C语言中的case设计的。

    func switchDemo5() {
        s := "a"
        switch {
        case s == "a":
            fmt.Println("a")
            fallthrough // 无条件执行下一个case(穿透)
        case s == "b":
            // 上一个条件满足之后会执行这条语句   fallthrough 
            fmt.Println("b")
        case s == "c":
            fmt.Println("c")
        default:
            fmt.Println("...")
        }
    }
    

    输出:

    a
    b
    

    六、总结

    1. swith是if分支的演变
    2. swith基本使用,default默认值,多表达式判断,无表达式,
    3. fallthrough:无条件执行下一个case分支
    switch 变量{
      case 1:
      	fmt.Println()
     case 2:
      	fmt.Println()
    }
    
    switch 变量{
      case 1:
      	fmt.Println()
     case 2:
      	fmt.Println()
      default:
      	fmt.Println("当上面条件不匹配,执行我")
    }
    
    switch 变量{
      case 1,4,5:
      	fmt.Println()
     case 2,6,8:
      	fmt.Println()
      default:
      	fmt.Println("当上面条件不匹配,执行我")
    }
    
    switch {
      case a==1&&a==7:
      	fmt.Println()
     case a==2||a==4:
      	fmt.Println()
      default:
      	fmt.Println("当上面条件不匹配,执行我")
    }
    
    switch {
      case a==1&&a==7:
      	fmt.Println()
      	fallthrough
     case a==2||a==4:
      	fmt.Println()
      	fallthrough
      default:
      	fmt.Println("当上面条件不匹配,执行我")
    }
    
    
    在当下的阶段,必将由程序员来主导,甚至比以往更甚。
  • 相关阅读:
    剑指offer55. 平衡二叉树
    剑指offer52. 两个链表的第一个公共节点
    LC1043. Partition Array for Maximum Sum
    剑指offer40. Top K
    剑指offer39. 数组中出现次数超过一半的数字
    剑指offer36.将BST原地转换为双向循环链表
    判断大小端
    CentOS安装RabbitMQ 3.8.9
    Nginx 413 Request Too Large 错误
    NginxPC端和移动端区分
  • 原文地址:https://www.cnblogs.com/randysun/p/15409435.html
Copyright © 2020-2023  润新知