[从零学习 Go 语言(09)流程控制之switch-case

hello_wbm · · 775 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

Hi,大家好呀,我是一个刚学习 Go 语言不久的新手,在入门 Golang 的这段时间里,我写了很多详细的学习笔记,很适合新手学习噢。这些文章已经发布在我的个人微信公众号里:《Go编程时光》里,今天开始将文章内容搬运到这里,希望有更多的人看到,给更的人带来帮助,但是这里文章会相对滞后,想获取最新文章,可以前往关注《Go编程时光》,请放心关注,这是一个纯分享的号,完全没有广告。 **系列导读 ** [从零学习 Go 语言(01):一文搞定开发环境的搭建](https://studygolang.com/articles/27365) [从零学习 Go 语言(02):学习五种变量创建的方法](https://studygolang.com/articles/27432) [从零学习 Go 语言(03):数据类型之整型与浮点型](https://studygolang.com/articles/27440) [从零学习 Go 语言(04):byte、rune与字符串](https://studygolang.com/articles/27463) [从零学习 Go 语言(05):数据类型之数组与切片](https://studygolang.com/articles/27508) [从零学习 Go 语言(06):数据类型之字典与布尔类型](https://studygolang.com/articles/27563) [从零学习 Go 语言(07):数据类型之指针](https://studygolang.com/articles/27585) [从零学习 Go 语言(08):流程控制之if-else](https://studygolang.com/articles/27613) --- Go里的流程控制方法还是挺丰富,整理了下有如下这么多种: - if - else 条件语句 - switch - case 选择语句 - for - range 循环语句 - goto 无条件跳转语句 - defer 延迟执行 上一篇讲了 if -else 条件语句,今天先来讲讲 switch - case 选择语句。 ## 0. 语句模型 Go 里的选择语句模型是这样的 ```go switch 表达式 { case 表达式1: 代码块 case 表达式2: 代码块 case 表达式3: 代码块 case 表达式4: 代码块 case 表达式5: 代码块 default: 代码块 } ``` 拿 switch 后的表达式分别和 case 后的表达式进行对比,只要有一个 case 满足条件,就会执行对应的代码块,然后直接退出 switch - case ,如果 一个都没有满足,才会执行 default 的代码块。 ## 1. 最简单的示例 switch 后接一个你要判断变量 `education` (学历),然后 case 会拿这个 变量去和它后面的表达式(可能是常量、变量、表达式等)进行判等。 如果相等,就执行相应的代码块。如果不相等,就接着下一个 case。 ```go 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 后可以接多个多个条件,多个条件之间是 `或` 的关系,用逗号相隔。 ```go 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 **错误案例一** ```go gender := "male" switch gender { case "male": fmt.Println("男性") // 与上面重复 case "male": fmt.Println("男性") case "female": fmt.Println("女性") } ``` **错误案例二** ```go gender := "male" switch gender { case "male", "male": fmt.Println("男性") case "female": fmt.Println("女性") } ``` ## 4. switch 后可接函数 switch 后面可以接一个函数,只要保证 case 后的值类型与函数的返回值 一致即可。 ```go 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 ```go 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` 开启穿透能力的时候。 ```go s := "hello" switch { case s == "hello": fmt.Println("hello") fallthrough case s != "world": fmt.Println("world") } ``` 代码输出如下: ``` hello world ``` 需要注意的是,fallthrough 只能穿透一层,意思是它只给你一次再判断case的机会,不管你有没有匹配上,都要退出了。 ```go 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 ``` --- ![](http://image.python-online.cn/20200321153457.png)

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

775 次点击  ∙  1 赞  
加入收藏 微博
被以下专栏收入,发现更多相似内容
1 回复  |  直到 2021-12-18 01:55:22
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传