程序流程控制2

switch分支结构:

1)switch语句用于基本不同条件执行不同动作,每一个 case分支都是唯一的,从上到下逐一测试,直到匹配为止。
2)匹配项后面也不需要在加break

基本语法:

swith 表达式 {

case 表达式1,表达式2,...:
  语句块1

case 表达式3,表达式4,... :
  语句块2

//这里可以有多个case语句

default:
  语句块
}

程序流程控制2_第1张图片

对上图的说明和总结

1)switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块然后退出switch控制。
2)如果switch 的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块。执行后退出switch控制。
3)在golang中case 后的表达式可有多个,使用 逗号 间隔。
4)在golang中不需要写break,因为默认会有 break。在默认情况下,当程序执行完一个case语句块后就直接退出该switch控制。


案例;

请编写一个程序,改程序可以接受一个字符,比如:a,b,c,d,e,f,g
a表示星期一,b表示星期二 ... 根据用户输入的显示相应的的信息。

要求使用switch 语句完成


代码编写:

func main() {

  //1.定义一个变量接收字符
  //2.使用switch完成

  var key byte
  fmt.Println("请输入一个字符 a,b,c,d,e,f,g")
  fmt.Scanf("%c", &key)

  switch key {
    case 'a' :
      fmt.Println("周一, 猴子穿新衣")

    case 'b' :
      fmt.Println("周二, 猴子当小二")

    case 'c' :
      fmt.Println("周三,猴子去爬山")

    case 'd' :
      fmt.Println("周四,猴子去考试")

    case 'e' :
      fmt.Println("周五,猴子去跳舞")

    case 'f' :
      fmt.Println("周六,猴子去溜溜")

    case 'g' :
      fmt.Println("周日,猴子过生日 ")

    default:
      fmt.Println("输入错误...")
  }

}

 

switch细节讨论:

1)case后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以,甚至还可以运算)

2)case后的各个表达式的值的数据类型,必须和switch 的表达式数据类型一致

func main() {
  var n1 int32 = 20
  var n2 int64 = 20
  switch n1 {
    case n2 :   //错误,原因是 n2的数据类型和n1不一致
      fmt.Println("ok1")
    default :
      fmt.Println("没有匹配到")
  }
}

3)case后面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2...

func main() {
  var n1 int32 = 5
  var n2 int32 = 20
  switch n1 {
    case n2, 10, 5 :    // case 后面可以有多个表达式,n1会跟n2, 10, 5都匹配一遍。
      fmt.Println("ok1")
    default :
      fmt.Println("没有匹配到")
  }
}

4)case后面的表达式如果是常量值(字面量),则要求不能重复

5) case后面不需要带break,程序匹配到一个case后就会执行对应的代码块,然后退出switch,如果一个都匹配不到,则执行default

6)default 语句不是必须的。

7)switch 后也可以不带表达式,类似多个if--else分支来使用。

func main() {
  var age int = 10
  switch {
    case age == 10 :
      fmt.Println("age == 10")
    case age == 20 :
      fmt.Println("age == 20")
    default :
      fmt.Println("没有匹配到")
  }
}

8)switch 后也可以直接声明/定义一个变量,分号结束,不推荐。

9)switch 穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透。


func main() {
  //switch 的穿透 fallthrough
  var num int = 10
  switch num {
    case 10 :
      fmt.Println("ok1")
      fallthrough //默认只能穿透一层
    case 20 :
      fmt.Println("ok2")
    case 30 :
      fmt.Println("ok3")
    default :
      fmt.Println("没有匹配到")
  }
}

 

10)Type Switch:switch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的变量类型 【还没有学interface,先体验一把】

func main() {

  var x interface{}

  var y = 10.0

  x = y

  switch i := x.(type) {

    case nil:

      fmt.Printf(" x 的类型~ :%T",i)

    case int:

      fmt.Printf(" x 是 int 型")

    case float64:

      fmt.Printf(" x 是 float64 型")

    case func(int) float64:

      fmt.Printf(" x 是 func(int) 型")

    case bool, string:

      fmt.Printf(" x 是 bool 或 string 型")

    default:

      fmt.Printf("未知型")

  }

}

 

练习:

1、使用switch把小写类型的 char型转为大写(键盘输入)。只转换a,b,c,d,e 其它的输出“other”。

func main() {

  var char byte
  fmt.Println("请输入一个字符:")
  fmt.Scanf("%c", &char)

  switch char {
    case 'a' :
      fmt.Println("A")
    case 'b' :
      fmt.Println("B")
    case 'c' :
      fmt.Println("C")
    case 'd' :
      fmt.Println("D")
    case 'e' :
      fmt.Println("E")
    default :
      fmt.Println("other")
  }
}

2、对学生成绩大于60分的,输出“合格”。低于60分的,输出“不合格”。(注:输入的成绩不能大于100)

func main() {
  var score int
  fmt.Println("请输入成绩:")
  fmt.Scanln(&score)
  switch {
    case score >= 60 && score <= 100 :
      fmt.Println("及格")
    case score >= 0 && score < 60 :
      fmt.Println("不及格")
    default :
      fmt.Println("输入有误...")
  }
}

3、根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12,1,2 冬季

func main() {
  var month byte
  fmt.Println("请输入月份")
  fmt.Scanln(&month)
  switch month {
    case 3, 4, 5 :
      fmt.Println("春季")
    case 6, 7, 8 :
      fmt.Println("夏季")
    case 9, 10, 11 :
      fmt.Println("秋季")
    case 12, 1, 2 :
      fmt.Println("冬季")
    default :
      fmt.Println("你输入错误")
  }
}

4、根据用户输入显示对应的星期时间(string),如果“星期一”,显示“干煸豆角” ,如果“星期二”,显示“醋溜土豆”,如果“星期三”,显示“红烧狮子头”,如果“星期四”,显示“油炸花生米”,如果“星期五”,显示“蒜蓉扇贝”,如果“星期六”,显示“东北乱炖”,如果“星期日”,显示“大盘鸡”。

func main() {

  var week string
  fmt.Println("请输入星期几:")
  fmt.Scanln(&week)

  switch week {
    case "星期一" :
      fmt.Println("干煸豆角")
    case "星期二" :
      fmt.Println("醋溜土豆")
    case "星期三" :
      fmt.Println("红烧狮子头")
    case "星期四" :
      fmt.Println("油炸花生米")
    case "星期五" :
      fmt.Println("蒜蓉扇贝")
    case "星期六" :
      fmt.Println("东北乱炖")
    case "星期日" :
      fmt.Println("大盘鸡")
    default :
      fmt.Println("您输入错误")
  }
}


switch 和 if 的比较:

1)如果判断的具体数值不多,而且符合整数、浮点数、字符、字符串这几种类型。建议使用switch语句,简洁高效。
2)其他情况,对区间判断和结果为bool类型的判断,使用if,if的使用范围更广。

转载于:https://www.cnblogs.com/green-frog-2019/p/11343164.html

你可能感兴趣的:(程序流程控制2)