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…



目录
相关文章
|
6月前
|
Go 索引
Go 语言学习之流程控制
Go 语言学习之流程控制
20 0
|
7月前
|
Go 开发者 索引
Go之流程控制大全: 细节、示例与最佳实践2
Go之流程控制大全: 细节、示例与最佳实践2
47 0
|
7月前
|
程序员 Go 索引
Go之流程控制大全: 细节、示例与最佳实践1
Go之流程控制大全: 细节、示例与最佳实践
69 0
|
编译器 Go 索引
巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
流程结构就是指程序逻辑到底怎么执行,进而言之,程序执行逻辑的顺序。众所周知,程序整体都是自上由下执行的,但有的时候,又不仅仅是从上往下执行那么简单,大体上,Go lang程序的流程控制结构一共有三种:顺序结构,选择结构,循环结构。顺序结构:从上向下,逐行执行;选择结构:条件满足,某些代码才会执行,0-1次;循环结构:条件满足,某些代码会被反复的执行多次,0-N次
巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
Go语言之流程控制
Go语言之流程控制
73 0
Go语言之流程控制
|
Go C语言 索引
GO语言基础教程6——流程控制-循环语句
Go 语言中的所有循环类型均可以使用for关键字来完成。
GO语言基础教程5——流程控制-条件判断
流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。 本节课带来了就是流程控制中的条件判断——if语句/if else语句。
|
存储 自然语言处理 程序员
Go 语言快速入门指南:第三篇 流程控制
上一章中,我们学会了变量与常量,为了让我们的程序更加贴近实际生活,有时候我们需要做决定。 Go 提供了如下三种控制结构:if/else 语句、switch 语句、for 语句
Go 语言快速入门指南:第三篇 流程控制
|
编译器 Go
[GO专栏-6]Go语言流程控制
[GO专栏-6]Go语言流程控制
73 0
|
存储 编译器 Go
Go基础:流程控制-if、switch、select、for
Go基础:流程控制-if、switch、select、for
148 0
Go基础:流程控制-if、switch、select、for