【Go语言】Go语言中的流程控制

Go语言中的流程控制

流程控制主要用于设定计算执行的顺序,简历程序的逻辑结果,Go语言的流程控制语句与其他语言类似,支持如下几种流程控制语句:

  • 条件语句:用于条件判断,对应的关键字有if、else和else if;

  • 分支语句:用于分支选择,对应的关键字有switch、case和select(用于通道);

  • 循环语句:用于循环迭代,对应的关键字有for和range;

  • 跳转语句:用于代码跳转,对应的关键字有goto。

1 条件语句

条件语句的示例模板:

// if
if condition { // do something 
}
// if...else...
if condition { // do something 
} else {// do something 
}
// if...else if...else...
if condition1 { // do something 
} else if condition2 {// do something else 
} else {// catch-all or default 
}

注意以下几点:

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

  • 无论语句体内有几条语句,花括号 {} 都是必须存在的;

  • 左花括号 { 必须与 if 或者 else 处于同一行;

  • 在 if 之后,条件语句之前,可以添加变量初始化语句,使用 ; 间隔,例如: if score := 100;score > 90 {

以下是一个简单的条件语句代码示例:

score := 100
if score > 85 {fmt.Println("优秀")
} else if score > 70 {fmt.Println("良好")
} else if score >= 60 {fmt.Println("及格")
} else {fmt.Println("不及格")
}

2 分支语句

分支语句会根据传入条件的不同,选择不同的分支代码执行。

分支语句的示例模板:

switch var1 {case val1:... case val2:... case val3,val4:...case val5:...fallthrough // 添加该语句default:...
}

注意以下几点:

  • 和条件语句一样,左花括号 { 必须与 switch 处于一行;

  • 单个 case 中,可以出现多个结果选项(通过逗号分隔);

  • Go语言中的分支语句不需要break来明确退出一个case;

  • 只有在case中明确添加 fallthrough 关键字,才会继续执行紧跟着的下一个case语句;

  • 可以不设定 switch 之后条件表达式,这种情况下,整个 switch 结构与多个if...else...的逻辑作用等同。

一个简单的分支语句示例:

score := 100
switch {
case score > 85:fmt.Println("优秀")
case score > 70 && score <= 85:fmt.Println("良好")
case score >= 60 && score <= 70:fmt.Println("及格")
default:fmt.Println("不及格")
}

Go语言中,可以通过逗号分隔不同的分支条件达到合并分支的目的,如 case 90,100,而不能像其他语言一样,通过相邻的case语句来进行分支的合并,这是因为Go语言不需要通过break退出某个分支,上一个case分支语句执行结束后,会自动进行退出,如果一定要执行后续的case语句,可以通过fallthrough语句来声明。

month := 1
switch month {
case 3, 4, 5:fmt.Println("春季")
case 6, 7, 8:fmt.Println("夏季")
case 9, 10, 11:fmt.Println("秋季")
case 12:fmt.Println("冬季")fallthrough
case 1, 2:fmt.Println("冬季")
}

3 循环语句

Go语言中使用循环语句,需要注意以下几点:

  • 和条件语句、分支语句一样,左花括号 { 必须与for处于同一行;

  • 只支持for关键字循环语句,不支持while和do-while结构的循环语句;

  • 可以通过for-range结构对可迭代的集合进行遍历;

  • 支持基于条件判断进行循环迭代;

  • 允许在循环条件中定义和初始化变量,且支持多重赋值;

  • Go语言的for循环同样支持continue和break来控制循环,但是它提供了一个更高级的break,可以选择中断哪一个循环。

3.1 for循环

Go语言的循环语句只支持 for 关键字,而不支持 while 和 do-while 结构,Go语言中,for循环的循环条件不包含括号,示例代码如下:

sum := 0
for i :1; i <= 100; i++ {sum += i
}
fmt.Println(sum)

3.2 无限循环

Go语言仅支持for循环,针对无限循环的场景,可以通过不带循环条件的for循环实现,代码如下:

// 不指定循环语句,直接进行for循环,通过break退出循环语句
sum2 := 0
j := 0
for {j++if j > 100 {break}sum2 += j
}

3.3 多重循环

for 循环的条件表达式也支持多重赋值,可以实现数组/切片首尾元素的交换,代码如下:

array := []int{1, 2, 3, 4, 5, 6}
for i, j := 0, len(array)-1; i < j; i, j = i+1, j-1 {array[i], array[j] = array[j], array[i]
}
fmt.Println(array)

3.4 for-range结构

Go语言中支持通过for-range结构对于可迭代的集合(数组、切片、字典)进行循环遍历,使用方式如下:

array := []int{1, 2, 3, 4, 5, 6}
for k, v := range array {fmt.Println(k, v)
}

也可以只获取键,或者只获取值,代码示例如下:

// 只获取键
for k := range array {fmt.Printf("%d ", k)
}
// 只获取值
for _, v := range array {fmt.Printf("%d ", v)
}

3.5 基于条件判断循环

只有满足指定的条件才会执行循环体中的代码,代码示例如下:

sum := 0
i := 0
for i < 100 {i++sum += i
}
fmt.Println(sum)

4 跳转语句

4.1 break与continue语句

Go语言支持在循环语句中通过break语句跳出循环,通过continue语句进入下一个循环。

break语句代码示例:

sum := 0
i := 0
for {i++if i > 100 {break}sum += i
}

continue语句代码示例:

for i = 0; i < 5; i++ {if i%2 == 0 {continue}fmt.Printf("%d ", i)
}

4.2 标签

Go语言中的break和continue支持与标签结合跳转到指定的标签语句,标签通过 标签名 : 进行声明:

break 标签代码示例:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {break ITERATOR1}fmt.Println(num)}
}

如上所示,当j>1,此时循环执行到arr[0,2],直接跳到标签ITERATOR1的位置,也即跳出了外层循环,同样的语句换成continue再次执行:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
ITERATOR1:
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {continue ITERATOR1}fmt.Println(num)}
}

4.3 goto语句

goto语句并不建议使用,因为很容易造成代码的逻辑混乱,导致难以发现的Bug,代码示例如下:

arr := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
for i := 0; i < 3; i++ {for j := 0; j < 3; j++ {num := arr[i][j]if j > 1 {goto EXIT}fmt.Println(num)}
}
EXIT:
fmt.Println("EXIT.")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/501202.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

易毅出席成套低温烘干装备在发酵行业的节能创新应用

演讲嘉宾&#xff1a;易毅 总经理 广东芬蓝环境科技有限公司 演讲题目&#xff1a;成套低温烘干装备在发酵行业领域的节能创新应用 会议简介 “十四五”规划中提出&#xff0c;提高工业、能源领城智能化与信息化融合&#xff0c;明确“低碳经济”新的战略目标&#xff0c;热…

超越向量检索!混合检索 + 重排序改善 RAG 应用 | 新程序员

【导读】随着时间推移&#xff0c;RAG 技术已经迅速成为在实际应用中部署大型语言模型&#xff08;LLMs&#xff09;的首选方式。本文旨在介绍混合检索和重排序技术的基本原理&#xff0c;解释其对提升 RAG 系统文档召回效果的作用&#xff0c;并讨论构建生产级 RAG 应用的复杂…

基于STM32的四旋翼无人机项目(二):MPU6050姿态解算(含上位机3D姿态显示教学)

前言&#xff1a;本文为手把手教学飞控核心知识点之一的姿态解算——MPU6050 姿态解算&#xff08;飞控专栏第2篇&#xff09;。项目中飞行器使用 MPU6050 传感器对飞行器的姿态进行解算&#xff08;四元数方法&#xff09;&#xff0c;搭配设计的卡尔曼滤波器与一阶低通滤波器…

如何解决 Microsoft Visual C++ 14.0 or greater is required. Get it with “Microsoft C++ Build Tools“

报错代码 错误&#xff1a;需要Microsoft Visual C14.0或更高版本。使用“Microsoft C构建工具”获取&#xff1a;https://visualstudio.microsoft.com/visual-cpp-build-tools/ 注意&#xff1a;此错误源于子流程&#xff0c;可能不是pip的问题。 报错原因 因为pip所安装的…

灰度负载均衡和普通负载均衡有什么区别

灰度负载均衡&#xff08;Gray Load Balancing&#xff09;与普通负载均衡的主要区别在于它们服务发布和流量管理的方式。 灰度负载均衡 目的&#xff1a;主要用于灰度发布&#xff0c;即逐步向用户发布新版本的服务&#xff0c;以减少新版本可能带来的风险。工作方式&#x…

GiantPandaCV | 一文理解RetNet(内含公式详解!)

本文来源公众号“GiantPandaCV”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;一文理解RetNet 0 前言 paper&#xff1a;https://arxiv.org/pdf/2307.08621.pdf code&#xff1a;https://github.com/microsoft/un 微软研究院…

5G时代对于工业化场景应用有什么改善

5G 不仅仅是 4G 的技术升级&#xff0c;而是将平板电脑和智能手机的技术升级。除了更好的高清视频流和其他高带宽应用&#xff0c;消费者不会注意到很多性能差异。然而&#xff0c;在工业领域&#xff0c;5G 代表着巨大的飞跃。 在工厂和厂房内&#xff0c; 设备的Wi-Fi 网络经…

应用在汽车电子控温器中的多路数字温度传感芯片

温控器&#xff0c;是指根据工作环境的温度变化&#xff0c;在开关内部发生物理形变&#xff0c;从而产生某些特殊效应&#xff0c;产生导通或者断开动作的一系列自动控制元件&#xff0c;也叫温控开关、温度保护器、温度控制器&#xff0c;简称温控器。或是通过温度保护器将温…

界面控件Telerik UI for ASP. NET Core教程 - 如何为网格添加上下文菜单?

Telerik UI for ASP.NET Core是用于跨平台响应式Web和云开发的最完整的UI工具集&#xff0c;拥有超过60个由Kendo UI支持的ASP.NET核心组件。它的响应式和自适应的HTML5网格&#xff0c;提供从过滤、排序数据到分页和分层数据分组等100多项高级功能。 上下文菜单允许开发者为应…

Unity中URP实现水体(整理优化)

文章目录 前言一、优化水的深度1、我们把 水流动的方向 和 水深浅过渡值&#xff0c;整合到一个四维变量中2、修改 水体流动方向3、在片元着色器中&#xff0c;修改使用过渡变量 二、优化泡沫三、优化水下的扭曲1、修复原本扰动UV的计算 四、优化水面高光1、把高光强度、光滑度…

Unity AssetBundle详解,加载本地包、加载网络包代码全分享

在Unity中,AssetBundle(简称AB包)是一种将多个文件或资源打包到一个文件中的方式,用于优化资源的加载和管理。使用AB包,可以按需加载资源,减少应用的初始加载时间,并可以实现热更新等功能。下面是一个基本的流程,展示如何在Unity中加载AB包并显示其中的资源。 步骤1:…

期货开户保证金保障市场正常运转

期货保证金是什么&#xff1f;在期货市场上&#xff0c;采取保证金交易制度&#xff0c;投资者只需按期货合约的价值&#xff0c;交一定比率少量资金即可参与期货合约买卖交易&#xff0c;这种资金就是期货保证金。期货保证金&#xff08;以下简称保证金〕按性质与作用的不同。…