Go switch 分支控制基础使用及细节

switch 分支控制

  • 基本的介绍
    • switch 语句用于基于不同条件执行不同动作,每一个 case 分支都是唯一的,从上到下逐一测试,直到匹配为止。
    • 匹配项后面也不需要再加 break
  • 基本语法
switch 表达式{

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

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

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

default:
        语句块
}

  • switch 的流程图

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

  • 演示案例
    • 请编写一个程序,该程序可以接收一个字符,比如: a,b,c,d,e,f,g a表示星期一,b表示星期二 … 根据用户的输入显示相依的信息.要求使用 switch 语句完成
//分析思路
//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("周三")
 	//...
 	default:
 		fmt.Println("输入有误...")
 }
  • 输出结果:


switch 的使用的注意事项和细节

  • case/switch 后是一个表达式( 即:常量值、变量、一个有返回值的函数等都可以)
//写一个非常简单的函数
func test(char byte) byte {
	return char + 1
}

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

switch test(key)+1 { //将语法现象
	case 'a':
		fmt.Println("周一, 猴子穿新衣")
	case 'b':
		fmt.Println("周二,猴子当小二")
	case 'c':
		fmt.Println("周三,猴子爬雪山")
	//...
	default:
		fmt.Println("输入有误...")
       }
}

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


  • case 后面可以带多个表达式,使用逗号间隔。
    • 比如 case 表达式 1, 表达式 2 ...
var n1 int32 = 51
var n2 int32 = 20
switch n1 {
	case n2, 10, 5 :  // case 后面可以有多个表达式
		fmt.Println("ok1")
	case 90 : 
		fmt.Println("ok2~")
}

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

  • case 后面不需要带 break , 程序匹配到一个 case 后就会执行对应的代码块,然后退出 switch,如果一个都匹配不到,则执行 default
  • default 语句不是必须的.
  • switch 后也可以不带表达式,类似 if --else 分支来使用
//switch 后也可以不带表达式,类似 if --else分支来使用
var age int = 10

switch {
	case age == 10 :
		fmt.Println("age == 10")
	case age == 20 :
		fmt.Println("age == 20")
	default :
		fmt.Println("没有匹配到")
}
//case 中也可以对 范围进行判断
var score int = 90
switch {
	case score > 90 :
		fmt.Println("成绩优秀..")
	case score >=70 && score <= 90 :
		fmt.Println("成绩优良...")
	case score >= 60 && score < 70 :
		fmt.Println("成绩及格...")
	default :
		fmt.Println("不及格")
}

  • switch 后也可以直接声明/定义一个变量,分号结束,不推荐
switch grade := 90; { // 在golang中,可以这样写
	case grade > 90 :
		fmt.Println("成绩优秀~..")
	case grade >=70 && grade <= 90 :
		fmt.Println("成绩优良~...")
	case grade >= 60 && grade < 70 :
		fmt.Println("成绩及格~...")
	default :
		fmt.Println("不及格~")
}

  • switch 穿透-fallthrough ,如果在 case 语句块后增加 fallthrough ,则会继续执行下一个 case,也叫 switch 穿透
var num int = 10
switch num {
	case 10:
		fmt.Println("ok1")
		fallthrough //默认只能穿透一层
	case 20:
		fmt.Println("ok2")
		fallthrough
	case 30:
		fmt.Println("ok3")	
	default:
		fmt.Println("没有匹配到..")
}
  • 输出结果:


  • Type Switchswitch 语句还可以被用于 type-switch 来判断某个 interface 变量中实际指向的变量类型


switch 的案例演示

  • 使用 switch 把小写类型的 char 型转为大写(键盘输入)。只转换 a, b, c, d, e. 其它的输出“other”。
 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")
 }

  • 对学生成绩大于 60 分的,输出“合格”。低于 60 分的,输出“不合格”。(注:输入的成绩不能大于 100)
var score float64
fmt.Println("请输入成绩")
fmt.Scanln(&score)

switch int(score / 60) {
	case 1:
		fmt.Println("及格")
	case 0:
		fmt.Println("不及格")
	default:
		fmt.Println("输入有误..")
}

  • 根据用户指定月份,打印该月份所属的季节。3,4,5 春季 6,7,8 夏季 9,10,11 秋季 12, 1, 2 冬季
var month byte
fmt.Println("请输入月份")
fmt.Scanln(&month)
switch month {
	case 3, 4, 5 :
		fmt.Println("spring")
	case 6, 7, 8 :
		fmt.Println("summer")
	case 9, 10, 11 :
		fmt.Println("autumn")
	case 12, 1, 2 :
		fmt.Println("winter")
	default:
		fmt.Println("输入有误..")
}

switch 和 if 的比较

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

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值