当前位置: 首页 > news >正文

Go基础:Go语言流程控制详解

文章目录

    • 一、流程控制概述
    • 二、条件语句
      • 2.1 基本语法
      • 2.2 特性
      • 2.3 示例代码
      • 2.4 switch 选择语句
    • 三、循环语句
      • 3.1 基本语法
      • 3.2 特性
      • 3.3 示例代码
    • 四、跳转语句
      • 4.1 基本语法
      • 4.2 特性
      • 4.3 示例代码

一、流程控制概述

Go 语言的流程控制是编写逻辑清晰、结构化程序的核心。流程控制语句用于控制程序的执行顺序,这样你的程序就具备了逻辑结构。一般流程控制语句需要和各种条件结合使用,比如用于条件判断的 if,用于选择的 switch,用于循环的 for 等。总结如下:

  • 1. 条件语句:优先使用 if 的短声明特性,减少变量作用域。避免嵌套过深,必要时使用 switch 语句替代。
  • 2. 循环语句:使用 for 循环实现所有循环逻辑,保持代码风格统一。使用 range 遍历集合类型,避免手动管理索引。
  • 3. 跳转语句:谨慎使用 goto,仅在必要时用于跳出复杂嵌套结构。优先使用 breakcontinue 控制循环流程。

以下从条件语句、循环语句和跳转语句三个方面,结合详细案例代码进行解析。

二、条件语句

if 语句是条件语句,它根据布尔值的表达式来决定选择哪个分支执行:如果表达式的值为 true,则 if 分支被执行;如果表达式的值为 false,则 else 分支被执行。

2.1 基本语法

Go 语言提供了 ifif...elseif...else if...else 等条件语句,用于根据布尔表达式的结果执行不同的代码块。

2.2 特性

  • 短声明if 语句支持在条件表达式中声明变量,这些变量的作用域仅限于 if 代码块。
  • 严格布尔判断:条件表达式必须返回布尔值,不支持隐式类型转换。

2.3 示例代码

package main
import "fmt"
func main() {// 基本条件判断x := 10if x > 5 {fmt.Println("x is greater than 5")} else {fmt.Println("x is not greater than 5")}// 带短声明的条件判断if num := 42; num%2 == 0 {fmt.Println(num, "is even")} else {fmt.Println(num, "is odd")}
}

输出

x is greater than 5
42 is even

2.4 switch 选择语句

if 条件语句比较适合分支较少的情况,如果有很多分支的话,选择 switch 会更方便,使用 switch 的代码案例如下:

switch i:=6;{
case i>10:fmt.Println("i>10")
case i>5 && i<=10:fmt.Println("5<i<=10")
default:fmt.Println("i<=5")
}

switch 语句同样也可以用一个简单的语句来做初始化,同样也是用分号 ; 分隔。每一个 case 就是一个分支,分支条件为 true 该分支才会执行,而且 case 分支后的条件表达式也不用小括号 () 包裹。

在 Go 语言中,switch 的 case 从上到下逐一进行判断,一旦满足条件,立即执行对应的分支并返回,其余分支不再做判断。也就是说 Go 语言的 switch 在默认情况下,case 最后自带 break。这和其他编程语言不一样,比如 C 语言在 case 分支里必须要有明确的 break 才能退出一个 case。Go 语言的这种设计就是为了防止忘记写 break 时,下一个 case 被执行。

那么如果你真的有需要,的确需要执行下一个紧跟的 case 怎么办呢?Go 语言也考虑到了,提供了 fallthrough 关键字。现在看个例子,如下面的代码所示:

switch j:=1;j {
case 1:fallthrough
case 2:fmt.Println("1")
default:fmt.Println("没有匹配")
}

以上示例运行会输出 1,如果省略 case 1: 后面的 fallthrough,则不会有任何输出。

当 switch 之后有表达式时,case 后的值就要和这个表达式的结果类型相同,比如这里的 j 是 int 类型,那么 case 后就只能使用 int 类型,如示例中的 case 1、case 2。如果是其他类型,比如使用 case “a” ,会提示类型不匹配,无法编译通过。

而对于 switch 后省略表达式的情况,整个 switch 结构就和 if……else 条件语句等同了。

switch 后的表达式也没有太多限制,是一个合法的表达式即可,也不用一定要求是常量或者整数。你甚至可以像如下代码一样,直接把比较表达式放在 switch 之后:

switch 2>1 {
case true:fmt.Println("2>1")
case false:fmt.Println("2<=1")
}

可见 Go 语言的 switch 语句非常强大且灵活。

三、循环语句

在 Go 语言中没有 while 循环,但是可以通过 for 达到 while 的效果,Go 语言里的 for 循环非常强大。在 Go 语言中,支持使用 continue、break 控制 for 循环:

  • continue 可以跳出本次循环,继续执行下一个循环。
  • break 可以跳出整个 for 循环,哪怕 for 循环没有执行完,也会强制终止。

3.1 基本语法

Go 语言仅提供 for 循环,但通过不同形式实现了多种循环功能,包括传统 for 循环、无限循环和 range 循环。

3.2 特性

  • 灵活性for 循环可以替代其他语言中的 while 循环。
  • range 关键字:用于遍历数组、切片、字符串、映射和通道。

3.3 示例代码

package main
import "fmt"
func main() {// 传统 for 循环for i := 0; i < 5; i++ {fmt.Println("Iteration:", i)}// 无限循环count := 0for {fmt.Println("Infinite loop")count++if count >= 3 {break}}// range 循环遍历字符串str := "Hello, Go"for index, char := range str {fmt.Printf("Index: %d, Character: %c\n", index, char)}
}

输出

Iteration: 0
Iteration: 1
Iteration: 2
Iteration: 3
Iteration: 4
Infinite loop
Infinite loop
Infinite loop
Index: 0, Character: H
Index: 1, Character: e
Index: 2, Character: l
Index: 3, Character: l
Index: 4, Character: o
Index: 5, Character: ,
Index: 6, Character:  
Index: 7, Character: G
Index: 8, Character: o

四、跳转语句

4.1 基本语法

Go 语言提供了 breakcontinuegoto 三种跳转语句,用于控制程序的执行流程。

4.2 特性

  • break:用于终止当前循环或 switch 语句。
  • continue:跳过当前循环的剩余部分,直接进入下一次循环。
  • goto:跳转到指定标签,适用于需要跳出多层嵌套结构的场景。

4.3 示例代码

package main
import "fmt"
func main() {// break 示例for i := 0; i < 5; i++ {if i == 3 {break}fmt.Println("Break example:", i)}// continue 示例for i := 0; i < 5; i++ {if i == 2 {continue}fmt.Println("Continue example:", i)}// goto 示例for i := 0; i < 5; i++ {if i == 3 {goto Exit}fmt.Println("Goto example:", i)}
Exit:fmt.Println("Exited loop")
}

输出

Break example: 0
Break example: 1
Break example: 2
Continue example: 0
Continue example: 1
Continue example: 3
Continue example: 4
Goto example: 0
Goto example: 1
Goto example: 2
Exited loop

通过掌握以上流程控制语句及其特性,可以编写出逻辑清晰、结构高效的 Go 语言程序。

http://www.dtcms.com/a/392861.html

相关文章:

  • 【硬件-笔试面试题-103】硬件/电子工程师,笔试面试题(知识点:项目当中无人机的控制是怎么实现的)
  • 融智学的信息科学与智能科学(信智科学)基础研究
  • PyTorch 容器类详解:nn.Sequential、nn.ModuleList 与 nn.ModuleDict
  • 基于规则的专家系统对自然语言处理深层语义分析的影响与启示综合研究报告
  • 微服务配置管理
  • WinDivert学习文档之五-————编程API(七)
  • 【StarRocks】-- 异步物化视图实战
  • 应用随机过程(一)
  • 【项目实战 Day4】springboot + vue 苍穹外卖系统(套餐模块 完结)
  • 素材库网站分享
  • 第8节-PostgreSQL数据类型-Text
  • React-router和Vue-router底层实现原理
  • 宝藏音乐下载站,免费好用
  • pygame AI snake 大乱斗
  • TCP FIN,TCP RST
  • 睡眠PSG统一数据集的设计思路
  • 告别Vibe Coding!敏捷AI驱动开发:用AI高效构建可维护的复杂项目
  • EA-LSS:边缘感知 Lift-splat-shot 框架用于三维鸟瞰视角目标检测
  • 和为 K 的子数组
  • 从流量红利到运营核心:“开源AI智能名片+链动2+1模式+S2B2C商城小程序”驱动电商行业价值重构
  • 【ICLR 2024】MogaNet:多阶门控聚合网络
  • 小语言模型(SLM):构建可扩展智能体AI的关键
  • ​​[硬件电路-293]:不同频率对应不同周期时间对应表
  • 自定义你的tqdm
  • Tiny10 os是啥?原来是精简的Windows10
  • ThingsBoard部署APP过程错误-flutterr Resolving dependencies
  • webpack入门基础
  • 机器视觉VUE3手势识别+手势检测控制相机缩放
  • AI大模型:(三)1.3 Dify文本生成快速搭建旅游助手
  • Linux文件下载卡在0%进度问题处理