您的位置 首页 golang

golang2021流程控制(9)switch结构

下面我们开始讲解选择中的另外一个结构就是switch结构。

在讲解switch结构之前,我们先来看如下问题:

 

李四的年终工作评定,如果定为A级,则工资涨500元,如果定为B级,则工资涨200元,如果定为C级,工资不变,如果定为D级工资降200元,如果定为E级工资降500元.

设李四的原工资为5000,请用户输入李四的评级,然后显示李四来年的工资.

 

大家看到如上题目,肯定想到的是用if-else if结构来实现,那么具体案例实现如下:

虽然以上代码实现了我们的需求,但是我们发现了一个问题,如果输入其它字符(例如:输入字符T),我们发现最终的结果不仅输出了“输入错误,程序退出”,同时还输出了“李四来年的工资是:5000”。如果输入错误了,这句话是不应该输出的,那么应该怎样进行处理呢?

通过上面的代码,我们实际上是定义了一个 bool 类型的变量,默认值为true,当输入评定级别错误时,将其改为false.最后在输出工资时,做了判断,如果条件成立表示输入了正确的评定级别,所以输出对应的工资,否则不输出工资。(这种技巧,需要大家好好体会一下)

我们前面在讲解if-else if结构时讲过,该结构适合什么场合:1.多条件判断,2:区间性的数据判断。但是我们看一下该案例,是否是对区间性的数据进行判断呢?不是,而是定值判断,也就是对一个固定值的判断。

对这种固定值的判断推进使用switch-case结构。

(1)switch-case结构语法如下:

switch 变量或者表达式的值{

case 值1:

要执行的代码

case 值2:

要执行的代码

case 值3:

要执行的代码

………………………………..

default:

要执行的代码

}

switch-case结构的执行流程:

程序执行到switch处,首先将变量或者表达式的值计算出来,然后拿着这个值依次跟每个case后面所带的值进行匹配,一旦匹配成功,则执行该case所带的代码,执行完成后,跳出switch-case结构。如果,跟每个case所带的值都不匹配。就看当前这个switch-case结构中是否存在default,如果有default,则执行default中的语句,如果没有default,则该switch-case结构什么都不做。

基本案例演示如下:

GO语言中switch-case结构中,case后面默认自带break(终止程序执行),这是与其它语言不同的地方。

 

另外一种语法格式如下:

 

注意:某个case 后面跟着的代码执行完毕后,不会再执行后面的case,而是跳出整个switch结构, 相当于每个case后面都跟着 break (终止),但是如果我们想执行完成某个case后,强制执行后面的case,可以使用fallthrough。

1) switch 语句用于基于不同条件执行不同动作,每一个 case  分支都是唯一的,从上到下逐一测 试,直到匹配为止。

2) 匹配项后面也不需要再加 break

 

 

下面我们用switch-case结构来实现上面的案例,示例如下:

 

Go语言提供了以下几种条件分支语句,如下表所示。

 

 

语句

描述

switch   语句

switch   语句用于基于不同条件执行不同动作

select   语句

select   语句类似于 switch 语句,但是 select 会随机执行一个可运行的 case。如果没有 case 可运行,它将阻塞,直到有 case 可运行

表:条件分支语句

1、语法结构

Go语言中 switch 语句的语法如下所示。

switch var1 {

    case val1:

        …

    case val2:

        …

    default:

        …

}

switch 语句的执行流程如下图所示。

 

图:switch 细节

switch 语句执行的过程是自上而下的,直到找到 case 匹配项,匹配项中无须使用 break,因为Go语言中的 switch 默认给每个 case 自带 break。因此匹配成功后不会向下执行其他的 case 分支,而是跳出整个 switch。可以添加 fallthrough(中文含义是:贯穿),强制执行后面的 case 分支。fallthrough 必须放在 case 分支的最后一行。如果它出现在中间的某个地方,编译器就会报错。

 

变量 var1 可以是任何类型,而 val1 和 val2 则可以是同类型的任意值。类型不局限于常量或整数,但必须是相同类型或最终结果为相同类型的表达式。

 

case 后的值不能重复,但可以同时测试多个符合条件的值,也就是说 case 后可以有多个值,这些值之间使用逗号分隔,例如:case val1, val2, val3。

 

switch 后的表达式可以省略,默认是 switch true。

 

【示例】使用 switch 语句判断学生的成绩。

 

  1. package      main

  2. import “fmt”

  3. func main() {

  4. /*定义局部变量*/

  5. grade := “”

  6. score := 78.5

  7. switch { //switch      后面省略不写,默认相当于:switch true

  8. case score >= 90:

  9. grade = “A”

  10. case score >= 80:

  11. grade = “B”

  12. case score >= 70:

  13. grade = “C”

  14. case score >= 60:

  15. grade = “D”

  16. default:

  17. grade = “E”

  18. }

  19. fmt.Printf(“你的等级是:%s\n”,      grade)

  20. fmt.Print(“最终评价是:”)

  21. switch grade {

  22. case “A”:

  23. fmt.Printf(“优秀!\n”)

  24. case “B”:

  25. fmt.Printf(“良好\n”)

  26. case “C”:

  27. fmt.Printf(“中等\n”)

  28. case “D”:

  29. fmt.Printf(“及格\n”)

  30. default:

  31. fmt.Printf(“差\n”)

  32. }

  33. }

运行结果如下:

你的等级是:C

最终评价是:中等

【示例】使用 switch 语句判断某年某月的天数。

 

  1. package      main

  2. import “fmt”

  3. func main() {

  4. /*定义局部变量:年、月、日*/

  5. year := 2008

  6. month := 2

  7. days := 0

  8. switch month {

  9. case 1, 3, 5, 7, 8, 10, 12:

  10. days = 31

  11. case 4, 6, 9, 11:

  12. days = 30

  13. case 2:

  14. if (year%4 == 0 &&      year%100 != 0) || year%400 == 0 {

  15. days = 29

  16. } else {

  17. days = 28

  18. }

  19. default:

  20. days = -1

  21. }

  22. fmt.Printf(“%d 年 %d      月的天数为:%d\n”, year, month, days)

  23. }

运行结果如下:

2008 年 2 月的天数为:29

2、类型转换

switch 语句还可以被用于 type switch(类型转换)来判断某个 interface 变量中实际存储的变量类型。关于 interface 变量的知识将在后续的章节中介绍。下面演示一下 type switch 的语法。其语法结构如下所示。

switch x.(type){

    case type:

        statement(s);

    case type:

        statement(s);

    /* 你可以定义任意个数的 case */

    default: /* 可选 */

        statement(s);

}

【示例】判断 interface 变量中存储的变量类型。

 

  1. package      main

  2. import “fmt”

  3. func main() {

  4. var x interface{}

  5. switch i := x.(type) {

  6. case nil:

  7. fmt. Printf (“x      的类型:%T”, i)

  8. case int:

  9. fmt.Printf(“x 是 int      型”)

  10. case float64:

  11. fmt.Printf(“x 是 float64      型”)

  12. case func(int) float64:

  13. fmt.Printf(“x 是      func(int) 型”)

  14. case bool, string:

  15. fmt.Printf(“x 是 bool 或      string 型”)

  16. default:

  17. fmt.Printf(“未知型”)

  18. }

  19. }

运行结果如下:

x 的类型:<nil>

文章来源:智云一二三科技

文章标题:golang2021流程控制(9)switch结构

文章地址:https://www.zhihuclub.com/98059.shtml

关于作者: 智云科技

热门文章

网站地图