Hi, 大家好, 我是明哥.
在自己学习 Golang 的这段时间里, 我写了详细的学习笔记放在我的个人微信公众号 《Go 编程时光》, 对于 Go 语言, 我也算是个初学者, 因此写的东西应该会比较适合刚接触的同学, 如果你也是刚学习 Go 语言, 不防关注一下, 一起学习, 一起成长.
我的在线博客: http://golang.iswbm.com/
我的 GitHub:GitHub.com/iswbm/GolangCodingTime
Go 里的流程控制方法还是挺丰富, 整理了下有如下这么多种:
if - else 条件语句
switch - case 选择语句
for - range 循环语句
goto 无条件跳转语句
defer 延迟执行
上一篇讲了 if -else 条件语句, 今天先来讲讲 switch - case 选择语句.
0. 语句模型
Go 里的选择语句模型是这样的
switch 表达式 {
case 表达式 1:
代码块
case 表达式 2:
代码块
case 表达式 3:
代码块
case 表达式 4:
代码块
case 表达式 5:
代码块
default:
代码块
}
拿 switch 后的表达式分别和 case 后的表达式进行对比, 只要有一个 case 满足条件, 就会执行对应的代码块, 然后直接退出 switch - case , 如果 一个都没有满足, 才会执行 default 的代码块.
1. 最简单的示例
switch 后接一个你要判断变量 education (学历), 然后 case 会拿这个 变量去和它后面的表达式 (可能是常量, 变量, 表达式等) 进行判等.
如果相等, 就执行相应的代码块. 如果不相等, 就接着下一个 case.
- import "fmt"
- func main() {
- education := "本科"
- switch education {
- case "博士":
- fmt.Println("我是博士")
- case "研究生":
- fmt.Println("我是研究生")
- case "本科":
- fmt.Println("我是本科生")
- case "大专":
- fmt.Println("我是大专生")
- case "高中":
- fmt.Println("我是高中生")
- default:
- fmt.Println("学历未达标..")
- }
- }
输出如下
我是本科生
2. 一个 case 多个条件
case 后可以接多个多个条件, 多个条件之间是 或 的关系, 用逗号相隔.
- import "fmt"
- func main() {
- month := 2
- 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("输入有误...")
- }
- }
输出如下
冬天
3. case 条件常量不能重复
当 case 后接的是常量时, 该常量只能出现一次.
以下两种情况, 在编译时, 都会报错: duplicate case "male" in switch
错误案例一
- gender := "male"
- switch gender {
- case "male":
- fmt.Println("男性")
- // 与上面重复
- case "male":
- fmt.Println("男性")
- case "female":
- fmt.Println("女性")
- }
错误案例二
- gender := "male"
- switch gender {
- case "male", "male":
- fmt.Println("男性")
- case "female":
- fmt.Println("女性")
- }
4. switch 后可接函数
switch 后面可以接一个函数, 只要保证 case 后的值类型与函数的返回值 一致即可.
- import "fmt"
- // 判断一个同学是否有挂科记录的函数
- // 返回值是布尔类型
- func getResult(args ...int) bool {
- for _, i := range args {
- if i <60 {
- return false
- }
- }
- return true
- }
- func main() {
- chinese := 80
- english := 50
- math := 100
- switch getResult(chinese, english, math) {
- // case 后也必须 是布尔类型
- case true:
- fmt.Println("该同学所有成绩都合格")
- case false:
- fmt.Println("该同学有挂科记录")
- }
- }
5. switch 可不接表达式
switch 后可以不接任何变量, 表达式, 函数.
当不接任何东西时, switch - case 就相当于 if - elseif - else
- score := 30
- switch {
- case score>= 95 && score <= 100:
- fmt.Println("优秀")
- case score>= 80:
- fmt.Println("良好")
- case score>= 60:
- fmt.Println("合格")
- case score>= 0:
- fmt.Println("不合格")
- default:
- fmt.Println("输入有误...")
- }
6. switch 的穿透能力
正常情况下 switch - case 的执行顺序是: 只要有一个 case 满足条件, 就会直接退出 switch - case , 如果 一个都没有满足, 才会执行 default 的代码块.
但是有一种情况是例外.
那就是当 case 使用关键字 fallthrough 开启穿透能力的时候.
- s := "hello"
- switch {
- case s == "hello":
- fmt.Println("hello")
- fallthrough
- case s != "world":
- fmt.Println("world")
- }
代码输出如下:
hello world
需要注意的是, fallthrough 只能穿透一层, 意思是它只给你一次再判断 case 的机会, 不管你有没有匹配上, 都要退出了.
- s := "hello"
- switch {
- case s == "hello":
- fmt.Println("hello")
- fallthrough
- case s == "xxxx":
- fmt.Println("xxxx")
- case s != "world":
- fmt.Println("world")
- }
输出如下, 并不会输出 world (即使它符合条件)
hello xxxx
系列导读
01. 开发环境的搭建(Goland & VS Code)
02. 学习五种变量创建的方法
03. 详解数据类型: 整形与浮点型
04. 详解数据类型: byte,rune 与 string
05. 详解数据类型: 数组与切片
06. 详解数据类型: 字典与布尔类型
07. 详解数据类型: 指针
08. 面向对象编程: 结构体与继承
09. 一篇文章理解 Go 里的函数
10. Go 语言流程控制: if-else 条件语句
11. Go 语言流程控制: switch-case 选择语句
12. Go 语言流程控制: for 循环语句
13. Go 语言流程控制: goto 无条件跳转
14. Go 语言流程控制: defer 延迟调用
15. 面向对象编程: 接口与多态
16. 关键字: make 和 new 的区别?
17. 一篇文章理解 Go 里的语句块与作用域
18. 学习 Go 协程: goroutine
19. 学习 Go 协程: 详解信道 / 通道
20. 几个信道死锁经典错误案例详解
21. 学习 Go 协程: WaitGroup
22. 学习 Go 协程: 互斥锁和读写锁
23. Go 里的异常处理: panic 和 recover
24. 超详细解读 Go Modules 前世今生及入门使用
25. Go 语言中关于包导入必学的 8 个知识点
26. 如何开源自己写的模块给别人用?
27. 说说 Go 语言中的类型断言?
28. 这五点带你理解 Go 语言的 select 用法
来源: http://www.tuicool.com/articles/7fiayar