Go语言流程控制(二)

embedded/2024/12/23 6:26:23/

switch语句

Go 语言中的 switch 语句是一种选择结构,用于基于不同条件执行不同的代码块。Go 的 switch 相较于其他语言的 switch 有一些独特的特点,使其更为灵活和强大。下面是Go语言中 switch 语句的详细介绍:

基本语法

switch expression {
case value1:// 当 expression 等于 value1 时执行的代码
case value2:// 当 expression 等于 value2 时执行的代码
// ... 可以有多个 case
default:// 如果没有任何 case 匹配,则执行这里的代码
}
  • expression: 用于比较的表达式,可以是任何类型。
  • case: 每个 case 后面跟着一个或多个值,如果这些值与 expression 的结果相等,则执行该 case 下的代码。
  • default: 可选,当没有任何 case 匹配时执行,默认情况可以出现在任何位置,甚至在 case 之前。

特点和注意事项

  1. 自动break:Go 的 switch 语句在匹配到一个 case 并执行完对应的代码块后会自动 break,这意味着它不会继续执行下一个 case,除非使用 fallthrough 关键字。

  2. 类型匹配:case 后的值与 switch 表达式的结果不必严格相等,只要类型兼容且值相等即可。例如,整数和浮点数之间如果值相等也能匹配。

  3. fallthrough:如果一个 case 后面跟随 fallthrough 关键字,那么即使当前 case 匹配,也会继续执行下一个 case,直到遇到 break 或到达 default

  4. 省略switch后的表达式:在某些情况下,可以省略 switch 后的表达式,这时它会根据 case 直接判断。

  5. 多值匹配:一个 case 可以匹配多个值,只需用逗号分隔这些值。

示例

基础示例

package mainimport "fmt"func main() {day := 3switch day {case 1:fmt.Println("Monday")case 2:fmt.Println("Tuesday")case 3:fmt.Println("Wednesday")default:fmt.Println("Invalid day")}
}//运行结果:Wednesday

fallthrough

package mainimport "fmt"func main() {score := 69switch {case score < 60:fmt.Println("Failed")case score < 70:fmt.Println("bad")fallthroughcase score < 50:fmt.Println("Passed")case score <= 100:fmt.Println("Excellent")}
}//运行结果
//bad
//Passed

在Go语言中,fallthrough 是一个关键字,用于 switch 语句中。它的作用是控制 switch 语句执行的流程,在匹配到当前 case 之后,直接继续执行紧接着的下一个 case,即使下一个 case 的条件没有被满足。这与许多其他编程语言中的 switch 语句默认行为不同,在那些语言中,一旦一个 case 匹配成功并执行后,会自动退出 switch 语句,除非显式使用 break 语句。

省略表达式

package mainimport "fmt"func main() {switch {case true:fmt.Println("This will always print.")}
}//运行结果: This will always print.

多值匹配

package mainimport "fmt"func main() {x := 3switch x {case 1, 3, 5:fmt.Println("Odd number")case 2, 4, 6:fmt.Println("Even number")}
}//运行结果: Odd number

goto语句

Go语言中 goto 语句通过标签进行代码间的无条件跳转,同时 goto 语句在快速跳出循环、避免重复退出上也有一定的帮助,使用 goto 语句能简化一些代码的实现过程。

使用 goto 退出多层循环

下面这段代码在满足条件时,需要连续退出两层循环,使用传统的编码方式如下:

package main
import "fmt"
func main() {var breakAgain bool// 外循环for x := 0; x < 10; x++ {// 内循环for y := 0; y < 10; y++ {// 满足某个条件时, 退出循环if y == 2 {// 设置退出标记breakAgain = true// 退出本次循环break}}// 根据标记, 还需要退出一次循环if breakAgain {break}}fmt.Println("done")
}

将上面的代码使用Go语言的 goto 语句进行优化:

package main
import "fmt"
func main() {for x := 0; x < 10; x++ {for y := 0; y < 10; y++ {if y == 2 {// 跳转到标签goto breakHere}}}// 手动返回, 避免执行进入标签return// 标签
breakHere:fmt.Println("done")
}

break

break 语句用于提前终止循环,使程序跳出当前循环结构。在多层嵌套循环中,你可以通过结合标签(labeled statement)来指定跳出哪一层循环。

基本用法

在最简单的情况下,break 用于立即结束最近的 for 循环。

package mainimport "fmt"func main() {for i := 0; i < 10; i++ {if i == 5 {break // 当 i 等于5时,跳出循环}fmt.Println(i)}
}

带标签的 break

如果在嵌套循环中需要跳出外层循环,可以在外层循环前定义一个标签,并在内层循环使用 break 加标签名来跳出指定的循环。

package mainimport "fmt"func main() {
outerLoop:for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {if i*j == 2 {break outerLoop // 跳出外层循环}fmt.Printf("(%d, %d)\n", i, j)}}fmt.Println("外层循环已结束")
}

continue

continue 语句用于跳过当前循环迭代中剩余的部分,直接开始下一次迭代。这对于在满足特定条件时跳过循环体中的一些操作非常有用。

基本用法

package mainimport "fmt"func main() {for i := 0; i < 10; i++ {if i%2 == 0 { // 如果i是偶数continue // 跳过本次循环的剩余部分,直接进行下一次迭代}fmt.Println(i) // 因此,这里只打印奇数}
}
注意事项
  • continue 仅影响它所在的最直接的循环迭代,不会影响外部循环。
  • 与 break 类似,continue 也可以配合标签使用来影响带有特定标签的循环迭代,但这在实际编程中较少见。

参考文章:Go语言goto语句——跳转到指定的标签 (biancheng.net)


http://www.ppmy.cn/embedded/40815.html

相关文章

d17(154-168)-勇敢开始Java,咖啡拯救人生

目录 方法递归 字符集 编码-解码 IO流 字节流 字节输入流 InputSream FileInputStream 字节输出流 OutputSream FileOutputSream 释放资源的方式 try-catch-finallly try-with-resource 字符流 字符输入流 Reader FileReader 文件字符输出流 Writer FileWriter …

支持标准Modbus TCP双网口高精度模拟量模块

M330E以太网远程I/O无线数据采集模块是一款工业级、隔离设计、高可靠性、高稳定性和高精度数据采集模块&#xff0c;嵌入式32位高性能微处理器MCU&#xff0c;集成2路工业10/100M自适应以太网模块里面。提供多种I/O&#xff0c;支持标准Modbus TCP&#xff0c;可集成到SCADA、O…

Rust 语言的“命名空间” —— mod

在Rust中&#xff0c;虽然没有像C中的namespace这样的显式关键字&#xff0c;但是Rust通过模块&#xff08;mod&#xff09;系统提供了一种类似命名空间的功能。模块允许你将相关的代码组织在一起&#xff0c;并可以通过pub关键字来控制哪些项&#xff08;如函数、结构体、枚举…

【C++】STL-list的使用

目录 1、list的使用 1.1 list的构造 1.2 list的遍历 1.3 list capacity 1.4 list element access 1.5 容量相关 list是一个带头双向循环链表 1、list的使用 1.1 list的构造 1.2 list的遍历 list只有两种遍历方式&#xff0c;因为没有operator[] 因为list的双向链表&am…

LeetCode 110. 平衡二叉树

LeetCode 110. 平衡二叉树 1、题目 题目链接&#xff1a;110. 平衡二叉树 给定一个二叉树&#xff0c;判断它是否是 平衡二叉树 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2…

Docker学习二(Centos):Docker安装并运行redis(成功运行)

文章目录 前言一、下载并挂载1. 拉取镜像2. 创建挂载目录3. 下载redis.conf文件4. 赋予权限5. 修改redis.conf 默认配置 二、docker运行redis三、检查redis运行状态四、navicat链接redis 前言 一、下载并挂载 1. 拉取镜像 docker pull redis2. 创建挂载目录 fengfanli是我自…

[C语言知识]return和exit到底有什么区别?

前言 &#x1f496;&#x1f496;&#x1f496;欢迎来到我的博客&#xff0c;我是anmory&#x1f496;&#x1f496;&#x1f496; 又和大家见面了 欢迎来到C语言知识系列 用通俗易懂的语言让编程语言不再困难 先来自我推荐一波 个人网站欢迎访问以及捐款 推荐阅读 如何低成本搭…

百度云防护自定义访问策略URI使用说明

百度云防护的创建防御模板里的自定义访问策略功能是一个不错自定义拦截功能。 其中URI拦截策略是一种非常不错的拦截手段&#xff0c;今天我们来说明下如何使用URI。 首先什么是URI&#xff1f;关于什么是URI百度上写了很多&#xff0c;不过对于小白来说&#xff0c;是非常难…