流程控制,一网打尽

网络 通信技术
除此之外,还有 break 和 continue,都可以搭配循环语句和跳转语句使用。跳转语句在某些场景下会非常实用,但也很容易出现一些莫名其妙的问题,所以使用起来要更谨慎些。

[[415477]]

最近看奥运会看的我热血沸腾,中国奥运健儿简直太棒了,不只是成绩,还有气质,精气神,全方位的棒。

而且这次奥运会我觉得最感动的是,看到一些年纪大的运动员拿了好成绩:吕小军 37 岁,马龙 32,苏炳添 32,巩立姣 32 岁才拿了自己的第一块奥运金牌。连这么受限于年龄的运动员都能不断突破自己,何况我们呢?还每天在网上焦虑程序员 35 岁就要被优化?

所以别给自己找年龄作为借口了,觉得年龄大了这不行那不行,干就完事了。

if-else

特点:

  • 条件语句不需要使用小括号 () 包起来;
  • 花括号 {} 必须有,并且左花括号 { 必须和 if 或 else 在同一行;
  • 在 if 之后,条件语句之前可以添加变量初始化语句,使用 ; 分隔。
  1. package main 
  2.  
  3. import "fmt" 
  4.  
  5. func main() { 
  6.     if 7%2 == 0 { 
  7.         fmt.Println("7 is even"
  8.     } else { 
  9.         fmt.Println("7 is odd") // 7 is odd 
  10.     } 
  11.  
  12.     if 8%4 == 0 { 
  13.         fmt.Println("8 is divisible by 4") // 8 is divisible by 4 
  14.     } 
  15.  
  16.     if num := 9; num < 0 { 
  17.         fmt.Println(num, "is negative"
  18.     } else if num < 10 { 
  19.         fmt.Println(num, "has 1 digit") // 9 has 1 digit 
  20.     } else { 
  21.         fmt.Println(num, "has multiple digits"
  22.     } 

switch

特点:

  • 左花括号 { 必须和 switch 在同一行;
  • 条件表达式不限制常量或者整数;
  • switch 后可添加变量初始化语句,使用 ; 分割;
  • 可以不设定条件表达式,在此种情况下,整个 switch 结构与多个 if-else 的逻辑作用等同;
  • 单个 case 中可以出现多个结果选项;
  • 在 case 中添加 fallthrough 关键字,会继续执行紧跟的下一个 case,不需要判断 case 的条件语句;
  • switch 支持 default 语句,当所有 case 都不满足时,执行 default 语句。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.     "time" 
  6.  
  7. func main() { 
  8.     i := 2 
  9.     fmt.Print("write ", i, " as "
  10.     switch i { 
  11.     case 1: 
  12.         fmt.Println("one"
  13.     case 2: 
  14.         fmt.Println("two") // write 2 as two 
  15.         fallthrough 
  16.     case 3: 
  17.         fmt.Println("three") // three 
  18.     case 4, 5, 6: 
  19.         fmt.Println("four, five, six"
  20.     } 
  21.  
  22.     switch num := 9; num { 
  23.     case 1: 
  24.         fmt.Println("one"
  25.     default
  26.         fmt.Println("nine") // nine 
  27.     } 
  28.  
  29.     switch time.Now().Weekday() { 
  30.     case time.Saturday, time.Sunday: 
  31.         fmt.Println("it's the weekend"
  32.     default
  33.         fmt.Println("it's a weekday") // it's a weekday 
  34.     } 
  35.  
  36.     t := time.Now() 
  37.     switch { 
  38.     case t.Hour() < 12: 
  39.         fmt.Println("it's before noon"
  40.     default
  41.         fmt.Println("it's after noon") // it's after noon 
  42.     } 

for

特点:

  • 条件表达式不需要使用小括号 () 包起来;
  • 花括号 {} 必须有,并且左花括号 { 必须和 for 在同一行;
  • 支持 continue 和 break。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.  
  6. func main() { 
  7.     i := 1 
  8.     // 只有条件 
  9.     for i <= 3 { 
  10.         fmt.Println(i) 
  11.         i = i + 1 
  12.     } 
  13.  
  14.     // 有变量初始化和条件 
  15.     for j := 7; j <= 9; j++ { 
  16.         fmt.Println(j) 
  17.     } 
  18.  
  19.     // 死循环 
  20.     for { 
  21.         fmt.Println("loop"
  22.         break 
  23.     } 
  24.  
  25.     // 遍历数组 
  26.     a := [...]int{10, 20, 30, 40} 
  27.     for i := range a { 
  28.         fmt.Println(i) 
  29.     } 
  30.     for i, v := range a { 
  31.         fmt.Println(i, v) 
  32.     } 
  33.  
  34.     // 遍历切片 
  35.     s := []string{"a""b""c"
  36.     for i := range s { 
  37.         fmt.Println(i) 
  38.     } 
  39.     for i, v := range s { 
  40.         fmt.Println(i, v) 
  41.     } 
  42.  
  43.     // 遍历字典 
  44.     m := map[string]int{"a": 10, "b": 20, "c": 30} 
  45.     for k := range m { 
  46.         fmt.Println(k) 
  47.     } 
  48.     for k, v := range m { 
  49.         fmt.Println(k, v) 
  50.     } 

goto,break,continue

goto 特点:

  • 只能在函数内跳转,需要配合标签一起使用;
  • 不能跳过内部变量声明语句;
  • 只能跳到同级作用域或者上层作用域内,不能跳到内部作用域内。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.  
  6. func main() { 
  7.     // 跳出循环 
  8.     for i := 0; ; i++ { 
  9.         if i == 2 { 
  10.             goto L1 
  11.         } 
  12.         fmt.Println(i) 
  13.     } 
  14. L1: 
  15.     fmt.Println("Done"
  16.  
  17.     // 跳过变量声明,不允许 
  18.     //  goto L2 
  19.     //  j := 1 
  20.     // L2: 

break 特点:

  • 单独使用,用于跳出 break 当前所在的 for、 switch、 select 语句的执行;
  • 和标签一起使用,用于跳出标签所标识的 for、 switch、 select 语句的执行,可用于跳出多重循环,但标签和 break 必须在同一个函数内。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.  
  6. func main() { 
  7.     // break 跳转到标签处,然后跳过 for 循环 
  8. L3: 
  9.     for i := 0; ; i++ { 
  10.         for j := 0; ; j++ { 
  11.             if i >= 2 { 
  12.                 break L3 
  13.             } 
  14.             if j > 4 { 
  15.                 break 
  16.             } 
  17.             fmt.Println(i, j) 
  18.         } 
  19.     } 

continue 特点:

  • 单独使用,用于跳出 continue 当前所在的 for 循环的本次迭代;
  • 和标签一起使用,用于跳出标签所标识的 for 语句的本次选代,但标签和 continue 必须在同一个函数内。
  1. package main 
  2.  
  3. import ( 
  4.     "fmt" 
  5.  
  6. func main() { 
  7.     // continue 跳转到标签处,然后执行 i++ 
  8. L4: 
  9.     for i := 0; ; i++ { 
  10.         for j := 0; j < 6; j++ { 
  11.             if i > 4 { 
  12.                 break L4 
  13.             } 
  14.             if i >= 2 { 
  15.                 continue L4 
  16.             } 
  17.             if j > 4 { 
  18.                 continue 
  19.             } 
  20.             fmt.Println(i, j) 
  21.         } 
  22.     } 

总结

本文主要介绍了流程控制语句,分别是条件语句,选择语句,循环语句和跳转语句。

  • 条件语句: 对应关键词 if,else 和 else if;
  • 选择语句: 对应关键词 switch,case,fallthrough 和 default;
  • 循环语句: 对应关键词 for 和 range;
  • 跳转语句: 对应关键词 goto。

除此之外,还有 break 和 continue,都可以搭配循环语句和跳转语句使用。

跳转语句在某些场景下会非常实用,但也很容易出现一些莫名其妙的问题,所以使用起来要更谨慎些。

文章中的脑图和源码都上传到了 GitHub,有需要的同学可自行下载。

地址: https://github.com/yongxinz/gopher/tree/main/sc

本文转载自微信公众号「AlwaysBeta」,可以通过以下二维码关注。转载本文请联系AlwaysBeta公众号。

 

责任编辑:武晓燕 来源: AlwaysBeta
相关推荐

2024-04-26 00:25:52

Rust语法生命周期

2023-04-06 09:08:41

BPM流程引擎

2024-02-27 10:11:36

前端CSS@规则

2021-10-11 07:55:42

浏览器语法Webpack

2013-08-02 10:52:10

Android UI控件

2024-04-07 08:41:34

2024-06-12 00:00:05

2024-08-26 10:01:50

2010-08-25 01:59:00

2011-12-02 09:22:23

网络管理NetQos

2013-10-16 14:18:02

工具图像处理

2019-07-24 15:30:00

SQL注入数据库

2021-05-20 11:17:49

加密货币区块链印度

2021-10-29 09:32:33

springboot 静态变量项目

2020-02-21 08:45:45

PythonWeb开发框架

2023-09-06 18:37:45

CSS选择器符号

2023-04-03 08:30:54

项目源码操作流程

2020-10-19 06:43:53

Redis脚本原子

2009-04-02 10:17:00

交换机产品选购

2023-09-26 00:29:40

CSS布局标签
点赞
收藏

51CTO技术栈公众号