程序流程控制2
switch分支结构:
1)switch语句用于基本不同条件执行不同动作,每一个 case分支都是唯一的,从上到下逐一测试,直到匹配为止。
2)匹配项后面也不需要在加break
基本语法:
swith 表达式 {
case 表达式1,表达式2,...:
          语句块1
        
case 表达式3,表达式4,... :
          语句块2
//这里可以有多个case语句
default:
          语句块
}

对上图的说明和总结
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的使用范围更广。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号