【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.mzph.cn/news/714637.shtml

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

相关文章

使用 Docker 部署 Fiora 在线聊天室平台

一、Fiora 介绍 Fiora 简介 Fiora 是一款开源免费的在线聊天系统。 GitHub&#xff1a;https://github.com/yinxin630/fiora Fiora 功能 注册账号并登录&#xff0c;可以长久保存你的数据加入现有群组或者创建自己的群组&#xff0c;来和大家交流和任意人私聊&#xff0c;并添…

MySQL 主从读写分离入门——基本原理以及ProxySQL的简单使用

一、读写分离工作原理 读写分离的工作原理&#xff1a;在大型网站业务中&#xff0c;当单台数据库无法满足并发需求时&#xff0c;通过主从同步方式同步数据。设置一台主服务器负责增、删、改&#xff0c;多台从服务器负责查询&#xff0c;从服务器从主服务器同步数据以保持一…

C语言数据结构——队列

目录 0.前言 1.队列的基本概念 2.队列的实现 2.1实现方式 2.2具体实现 3.队列的应用场景 4.一道队列的算法题&#xff08;LeetCode225. 用队列实现栈&#xff09; 5.结语 &#xff08;图像由AI生成&#xff09; 0.前言 在计算机科学领域&#xff0c;数据结构是组织和…

Linux篇: 进程控制

一、进程创建 1.1 fork函数初识 在Linux中&#xff0c;fork函数是非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。 返回值&#xff1a; 在子进程中返回0&#xff0c;父进程中返回子进程的PID&#xff0c;子进程创…

OSI七层模型/TCP四层模型

协议&#xff1a; 协议是双方共同指定的一组规则&#xff0c;在网络通信中表示通信双方传递数据和解释数据的一组规则。 从A上传文件到服务器B,需要在A和B之间制定一个双方都认可的规则&#xff0c;这个规则就叫文件传输协议&#xff0c;该协议是ftp协议的一个初级版本&#…

LeetCode 刷题 [C++] 第226题.翻转二叉树

题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 题目分析 深度优先搜索&#xff08;DFS&#xff09;- 递归方式 对于二叉树的镜像问题&#xff0c;很容易想到的就是使用递归来解决&#xff0c;自底向上依次翻转每一个节点…

2024年腾讯云优惠券领取页面_代金券使用方法_新老用户均可

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

百度SEO快排原理是什么?如何快速排名方法?

前言&#xff1a;我之前说过我不打算写这个快速排序。 首先&#xff0c;我从来没有在自己的网站上操作过所谓的快速排序。 其次&#xff0c;我不能像网上很多人写的那样透露百度快速排序的秘密&#xff08;说实话&#xff0c;你可以透露秘密&#xff09;。 方法是有了&#xff…

Postman: 前端必备工具还是后端独享利器

Postman 的使用场景&#xff1a;适用于前端和后端 Postman 是一个流行的 API 测试与开发工具。它被广泛地应用在前后端开发的过程中&#xff0c;但是很多人对于它的使用场景存在疑惑。那么&#xff0c;到底是前端用还是后端用呢&#xff1f;本文将从多个角度详细解答这个问题。…

【嵌入式——QT】QListWidget

QListWidget类提供了一个基于项的列表小部件&#xff0c;QListWidgetItem是列表中的项&#xff0c;该篇文章中涉及到的功能有添加列表项&#xff0c;插入列表项&#xff0c;删除列表项&#xff0c;清空列表&#xff0c;向上移动列表项&#xff0c;向下移动列表项。 常用API a…

C语言数据结构基础——双链表专题

前言 书接上回&#xff0c;双链表便是集齐带头、双向、循环等几乎所有元素的单链表PLUS. 1.初始化、创建双链表 typedef int LTDataType; typedef struct LTNode {LTDataType data;struct LTNode* next;struct LTNode* prev; }LTNode; 不同于单链表&#xff0c;此时每个节点应…

PySide6+VSCode Python可视化环境搭建

#记住在cmd中运行&#xff0c;不要在vscode里运行&#xff0c;否则env会装到工程目录下 python -m venv env #env\Scripts\activate.bat pip install pyside6 下载本期源码 vscode装一个PYQT Integration插件&#xff0c;设置好两个路径&#xff08;下面有个脚本用于获取路径&…

MySQL 数据库表设计和优化

一、数据结构设计 正确的数据结构设计对数据库的性能是非常重要的。 在设计数据表时&#xff0c;尽量遵循一下几点&#xff1a; 将数据分解为合适的表&#xff0c;每个表都应该有清晰定义的目的&#xff0c;避免将过多的数据存储在单个表中。使用适当的数据类型来存储数据&…

挑战杯 基于机器视觉的车道线检测

文章目录 1 前言2 先上成果3 车道线4 问题抽象(建立模型)5 帧掩码(Frame Mask)6 车道检测的图像预处理7 图像阈值化8 霍夫线变换9 实现车道检测9.1 帧掩码创建9.2 图像预处理9.2.1 图像阈值化9.2.2 霍夫线变换 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分…

范伟:你们怎么老提1,200呢,有什么典故啊?赵本山:没有啊!

范伟&#xff1a;你们怎么老提1,200呢,有什么典故啊?赵本山&#xff1a;没有啊&#xff01; --小品《面子》&#xff08;中3&#xff09;的台词 表演者&#xff1a;赵本山 高秀敏 范伟 &#xff08;接上&#xff09; 范伟&#xff1a;哎吃啊 赵&#xff1a;哎呀这电视看的挺…

cAdvisor+Prometheus+Grafana 搞定Docker容器监控平台

cAdvisorPrometheusGrafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台1、先给虚拟机上传cadvisor2、What is Prometheus?2.1、架构图 3、利用docker安装普罗米修斯4、安装grafana cAdvisorPrometheusGrafana 搞定Docker容器监控平台 1、先给虚拟机上传cadvisor cAd…

MySQL事务和锁机制

MySQL技术——事务和锁机制 一、事务&#xff08;1&#xff09;概述&#xff08;2&#xff09;ACID特性&#xff08;3&#xff09;事务并发存在的问题&#xff08;4&#xff09;事务的隔离级别 二、锁机制&#xff08;1&#xff09;锁的力度&#xff08;2&#xff09;表的分类&…

网络编程-编码与解码(Protobuf)

编码与解码 下面的文字都来自于极客时间 为什么要编解码呢&#xff1f;因为计算机数据传输的是二进制的字节数据 解码&#xff1a;字节数据 --> 字符串&#xff08;字符数据&#xff09; 编码&#xff1a;字符串&#xff08;字符数据&#xff09;–> 字节数据 我们在编…

公共字段自动填充

在开发中经常面临对于一些公共字段的赋值。 如在下表中&#xff1a; 如何让程序自动为我们需要赋值的公共字段进行赋值&#xff0c;避免在业务代码中重复写这些公共字段的赋值代码 如下图所示&#xff1a; 实现思路&#xff1a; 1.自定义注解AutoFill&#xff0c;用于标识需…

linux环境安装cuda toolkit

1 全新安装 如果环境中没安装过cuda版本&#xff0c; 这种情况下比较简单。 直接在https://developer.nvidia.com/cuda-toolkit-archive选择对应版本下载安装即可。 如下为安装cuda toolkit 11.8. 2 环境中已经存在其他版本 这种情况下比较复杂一些。 首先要确认最高支持的…