Go 专栏|流程控制,一网打尽

简介: 最近看奥运会看的我热血沸腾,中国奥运健儿简直太棒了,不只是成绩,还有气质,精气神,全方位的棒。本章讲解流程控制。

QQ图片20220423132109.png

if-else


特点:


  • 条件语句不需要使用小括号 () 包起来;


  • 花括号 {} 必须有,并且左花括号 { 必须和 ifelse 在同一行;


  • if 之后,条件语句之前可以添加变量初始化语句,使用 ; 分隔。


package main
import "fmt"
func main() {
  if 7%2 == 0 {
    fmt.Println("7 is even")
  } else {
    fmt.Println("7 is odd") // 7 is odd
  }
  if 8%4 == 0 {
    fmt.Println("8 is divisible by 4") // 8 is divisible by 4
  }
  if num := 9; num < 0 {
    fmt.Println(num, "is negative")
  } else if num < 10 {
    fmt.Println(num, "has 1 digit") // 9 has 1 digit
  } else {
    fmt.Println(num, "has multiple digits")
  }
}
复制代码


switch


特点:


  • 左花括号 { 必须和 switch 在同一行;


  • 条件表达式不限制常量或者整数;


  • switch 后可添加变量初始化语句,使用 ; 分割;


  • 可以不设定条件表达式,在此种情况下,整个 switch 结构与多个 if-else 的逻辑作用等同;


  • 单个 case 中可以出现多个结果选项;


  • case 中添加 fallthrough 关键字,会继续执行紧跟的下一个 case,不需要判断 case 的条件语句;


  • switch 支持 default 语句,当所有 case 都不满足时,执行 default 语句。


package main
import (
  "fmt"
  "time"
)
func main() {
  i := 2
  fmt.Print("write ", i, " as ")
  switch i {
  case 1:
    fmt.Println("one")
  case 2:
    fmt.Println("two") // write 2 as two
    fallthrough
  case 3:
    fmt.Println("three") // three
  case 4, 5, 6:
    fmt.Println("four, five, six")
  }
  switch num := 9; num {
  case 1:
    fmt.Println("one")
  default:
    fmt.Println("nine") // nine
  }
  switch time.Now().Weekday() {
  case time.Saturday, time.Sunday:
    fmt.Println("it's the weekend")
  default:
    fmt.Println("it's a weekday") // it's a weekday
  }
  t := time.Now()
  switch {
  case t.Hour() < 12:
    fmt.Println("it's before noon")
  default:
    fmt.Println("it's after noon") // it's after noon
  }
}
复制代码


for


特点:


  • 条件表达式不需要使用小括号 () 包起来;


  • 花括号 {} 必须有,并且左花括号 { 必须和 for 在同一行;


  • 支持 continuebreak


package main
import (
  "fmt"
)
func main() {
  i := 1
  // 只有条件
  for i <= 3 {
    fmt.Println(i)
    i = i + 1
  }
  // 有变量初始化和条件
  for j := 7; j <= 9; j++ {
    fmt.Println(j)
  }
  // 死循环
  for {
    fmt.Println("loop")
    break
  }
  // 遍历数组
  a := [...]int{10, 20, 30, 40}
  for i := range a {
    fmt.Println(i)
  }
  for i, v := range a {
    fmt.Println(i, v)
  }
  // 遍历切片
  s := []string{"a", "b", "c"}
  for i := range s {
    fmt.Println(i)
  }
  for i, v := range s {
    fmt.Println(i, v)
  }
  // 遍历字典
  m := map[string]int{"a": 10, "b": 20, "c": 30}
  for k := range m {
    fmt.Println(k)
  }
  for k, v := range m {
    fmt.Println(k, v)
  }
}
复制代码


goto,break,continue


goto 特点:


  • 只能在函数内跳转,需要配合标签一起使用;


  • 不能跳过内部变量声明语句;


  • 只能跳到同级作用域或者上层作用域内,不能跳到内部作用域内。


package main
import (
  "fmt"
)
func main() {
  // 跳出循环
  for i := 0; ; i++ {
    if i == 2 {
      goto L1
    }
    fmt.Println(i)
  }
L1:
  fmt.Println("Done")
  // 跳过变量声明,不允许
  //  goto L2
  //  j := 1
  // L2:
}
复制代码


break 特点:


  • 单独使用,用于跳出 break 当前所在的 forswitchselect 语句的执行;


  • 和标签一起使用,用于跳出标签所标识的 forswitchselect 语句的执行,可用于跳出多重循环,但标签和 break 必须在同一个函数内。


package main
import (
  "fmt"
)
func main() {
  // break 跳转到标签处,然后跳过 for 循环
L3:
  for i := 0; ; i++ {
    for j := 0; ; j++ {
      if i >= 2 {
        break L3
      }
      if j > 4 {
        break
      }
      fmt.Println(i, j)
    }
  }
}
复制代码


continue 特点:


  • 单独使用,用于跳出 continue 当前所在的 for 循环的本次迭代;


  • 和标签一起使用,用于跳出标签所标识的 for 语句的本次选代,但标签和continue 必须在同一个函数内。
package main
import (
  "fmt"
)
func main() {
  // continue 跳转到标签处,然后执行 i++
L4:
  for i := 0; ; i++ {
    for j := 0; j < 6; j++ {
      if i > 4 {
        break L4
      }
      if i >= 2 {
        continue L4
      }
      if j > 4 {
        continue
      }
      fmt.Println(i, j)
    }
  }
}
复制代码


总结


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


  • 条件语句: 对应关键词 ifelseelse if


  • 选择语句: 对应关键词 switchcasefallthroughdefault


  • 循环语句: 对应关键词 forrange


  • 跳转语句: 对应关键词 goto


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


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




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


地址:github.com/yongxinz/go…



目录
相关文章
|
7月前
|
Go
Go-新手速成-流程语句
Go-新手速成-流程语句
|
4月前
|
缓存 前端开发 中间件
[go 面试] 前端请求到后端API的中间件流程解析
[go 面试] 前端请求到后端API的中间件流程解析
|
3月前
|
关系型数据库 Go 数据处理
高效数据迁移:使用Go语言优化ETL流程
在本文中,我们将探索Go语言在处理大规模数据迁移任务中的独特优势,以及如何通过Go语言的并发特性来优化数据提取、转换和加载(ETL)流程。不同于其他摘要,本文不仅展示了Go语言在ETL过程中的应用,还提供了实用的代码示例和性能对比分析。
|
4月前
|
算法 测试技术 Go
|
4月前
|
Go C语言 索引
Go从入门到放弃之流程控制
Go从入门到放弃之流程控制
|
4月前
|
JSON 测试技术 Go
Go 单元测试完全指南(一)- 基本测试流程
Go 单元测试完全指南(一)- 基本测试流程
45 0
|
7月前
|
Go 开发者
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
【4月更文挑战第21天】本文介绍了Go语言中的流程控制语句,包括`if`、`switch`和`for`循环。`if`语句支持简洁的语法和初始化语句,但需注意比较运算符的使用。`switch`语句提供多分支匹配,可省略`break`,同时支持不带表达式的形式。`for`循环有多种形式,如基本循环和`for-range`遍历,遍历时修改原集合可能导致未定义行为。理解并避免易错点能提高代码质量和稳定性。通过实践代码示例,可以更好地掌握Go语言的流程控制。
57 3
Golang深入浅出之-Go语言流程控制:if、switch、for循环详解
|
7月前
|
数据采集 Web App开发 Go
Go语言与chromedp结合:实现Instagram视频抓取的完整流程
使用Go语言和chromedp库,本文展示了如何抓取Instagram的视频文件,同时通过代理IP保障爬虫稳定和隐私。步骤包括安装chromedp、配置代理(如亿牛云),创建Chrome会话,导航至Instagram,提取视频URL,然后下载视频。关键操作有设置代理服务器、启动Chrome会话、抓取和下载视频。提供的代码示例详细解释了实现过程,有助于开发者学习Instagram数据采集。
142 0
Go语言与chromedp结合:实现Instagram视频抓取的完整流程
|
7月前
|
Cloud Native 网络协议 Go
[云原生] Go web工作流程
[云原生] Go web工作流程
|
Go 索引
Go 语言学习之流程控制
Go 语言学习之流程控制
45 0