5. golang之switch分支控制

1. 基本的介绍

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

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

2. 基本语法

 3. switch的流程图

 对上图的说明和总结

1)switch的执行流程是,先执行表达式,得到值,然后和case的表达式进行比较,如果相等,就匹配到,然后执行对应的case的语句块,然后退出switch控制。

2)如果switch的表达式的值没有和任何的case的表达式匹配成功,则执行default的语句块。执行后退出switch的控制。

3)golang的case后的表达式可以有多个,使用逗号间隔

4)golang中的case语句块不需要写break,因为默认会有,即在默认情况下,当程序执行完case语句块后,就直接退出该switch控制结构。

4.switch快速入门案例

案例:

请编写一个程序,该程序可以接收一个字符,比如:a,b,c,d,e,f,g。a表示星期一,b表示星期二,根据用户的输入显示相应的信息。要求使用switch语句完成。

package main
import (
	"fmt"
)
func main() {
	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("输入有误")
	}
}

5. swtich的使用的注意事项和细节

1)case/switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)

package main
import (
	"fmt"
)

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("周三")
		case 'd':
			fmt.Println("周四")
		case 'e':
			fmt.Println("周五")
		case 'f':
			fmt.Println("周六")
		case 'g':
			fmt.Println("周日")
		default:
			fmt.Println("输入有误")
	}
}

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

// 2.case后的各个表达式的值的数据类型,必须和switch的表达式数据类型一致
	var n1 int32 = 20
	var n2 int64 = 20
	switch n1 {
	case n2: // 错误,原因是n2的数据类型和n1不一致,如过这里改成20则可以,因为这时并不是一个具体的数据类型
		 fmt.Println("ok1")
	default:
		fmt.Println("没有匹配到")
	}

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

// 3. case后面可以带多个表达式,使用逗号间隔。比如case表达式1,表达式2...
	var n3 int32 = 5
	var n4 int32 = 20
	switch n3 {
	case n4,10,5:
		fmt.Println("ok1")
	default:
		fmt.Println("没有匹配到")
	}

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

// 4. case后面的表达式如果是常量值(字面量),则要求不能重复
	var n5 int32 = 5
	var n6 int32 = 20
	var n7 int32 = 5
	switch n5 {
	case n6,10,5:
		fmt.Println("ok1")
	case n7:	// 如果是个变量值和已有的重复,则检测不出来会通过
		fmt.Println("ok2")
	case 5:	// 错误,因为前面我们有常量5,因此重复,就会报错
		fmt.Println("ok3")
	}

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

6)default语句不是必须的

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

package main
import (
	"fmt"
)
func main() {
	// 7. 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("没有匹配到")
	}
	// 7. 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("成绩不及格")		
	}
}

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

package main
import (
	"fmt"
)
func main() {
	// 8. switch后面也可以直接声明一个变量,分号结束,不推荐
	switch grade := 90; { // 在golang中也可以这么写,不能忘了分号
	case grade > 90:
		fmt.Println("成绩优秀")
	case grade >= 70 && grade <= 90:
		fmt.Println("成绩优良")
	case grade >= 60 && grade < 70:
		fmt.Println("成绩及格")
	case grade < 60:
		fmt.Println("成绩不及格")
	}
}

9)switch 穿透-fallthrough,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透:建议穿透不要过多使用

package main
import (
	"fmt"
)
func main() {
	// 9. switch穿透:fallthrough
	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("没用匹配到")
	}
}

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

package main
import (
	"fmt"
)
func main() {
	var x interface{}
	var y = 10.0
	x = y
	// x.(type)就是type的使用,这个时候会得到x真正指向的数据类型
	// x.type结合switch可以判断x这个空接口究竟是指向哪一种数据类型
	switch i := x.(type) {
	case nil:
		fmt.Println("x的类型为~ :%T",i)
	case int:
		fmt.Println("x是int类型")
	case float64:
		fmt.Println("x是float64类型")
	case func(int) float64:
		fmt.Println("x是func(int)类型")
	case bool, string:
		fmt.Println("x是bool或string类型")
	default:
		fmt.Println("未知类型")
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值