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

news2024/11/15 10:57:36

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.coloradmin.cn/o/1483336.html

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

相关文章

STM32-ADC一步到位学习手册

1.按部就班陈述概念 ADC 是 Analog-to-Digital Converter 的缩写&#xff0c;指的是模拟/数字转换器。它将连续变量的模拟信号转换为离散的数字信号。在 STM32 中&#xff0c;ADC 具有高达 12 位的转换精度&#xff0c;有多达 18 个测量通道&#xff0c;其中 16 个为外部通道&…

搜索算法(算法竞赛、蓝桥杯)--DFS单词接龙

1、B站视频链接&#xff1a;B20 DFS 单词接龙_哔哩哔哩_bilibili 题目链接&#xff1a;[NOIP2000 提高组] 单词接龙 - 洛谷 #include <bits/stdc.h> using namespace std; const int N25; int n,ans; int used[N];//每个单词的使用次数 string word[N];void dfs(string…

姓名若有孤寡数,极不利婚姻!

易经云“同声相应&#xff0c;同气相求”&#xff0c;一个人的名字会形成一个磁场&#xff0c;在个人的生活当中会影响到自己的方方面面&#xff0c;如运势、事业工作、桃花运等&#xff0c;同时也会影响自己的感情婚姻哦。 峰民曾经在办公室接待了一位女士&#xff0c;看了她…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

C++:内存管理|new和delete

创作不易&#xff0c;感谢三连支持&#xff01; 一、内存分布 为什么需要内存管理呢&#xff1f;&#xff1f;因为我们在程序的运行过程中会需要各种各样的数据&#xff0c;而我们根据数据的不同存储在不同的区域里面&#xff0c;是为了更高效地处理数据。而C语言相比Java来说…

知识图谱1——neo4j

2024年要搞知识图谱&#xff0c;因此没有办法&#xff0c;只能将我之前固守的JDK1.8&#xff0c;升级到JDK21&#xff0c;因为JDK21也是LTS版本&#xff0c;neo4j高版本就不支持JDK8&#xff0c;因此没有办法&#xff0c;只有升级了。写这篇只是一个搭建笔记&#xff0c;我的初…

【Qt学习】QSpinBox 与 QDateTimeEdit 控件 的介绍与实例()

文章目录 QSpinBox1.1 介绍1.2 实例使用 - &#xff08;模拟点餐-功能扩充&#xff09;1.3 资源文件 2. QDateTimeEdit2.1 介绍2.2 使用&#xff08;计算时间差值 / 间隔&#xff09;daysTo() 与 secsTo() 2.3 资源文件 QSpinBox 1.1 介绍 对于QSpinBox&#xff0c;我们可以查…

OSI七层模型/TCP四层模型

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

JavaScript练手小技巧:一文看懂<script>标签的 ansyc 和 defer

<script>标签的 ansyc 和 defer 属性。只对外部加载 JS 文件有效。 <script src"js/app.js" async></script> <script src"js/app.js" defer></script> 普通加载 js&#xff08;同步加载&#xff09;&#xff1a;会打断 …

uview2中上传文件和若依前后端分离配合的代码

uview2中的上传文件需要配合着自己后端的上传的代码 uview2 代码&#xff1a; uploadFilePromise(url) {return new Promise((resolve, reject) > {// 后续自己封装let a uni.uploadFile({//自己的请求路径url: that.$baseURL /uploadAvater, //上传的文件filePath: tha…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

诊所门诊电子处方软件操作教程及试用版下载,医务室处方笺管理系统模板教程

诊所门诊电子处方软件操作教程及试用版下载&#xff0c;医务室处方笺管理系统模板教程 一、前言 以下软件程序教程以 佳易王诊所电子处方软件V17.0为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 如上图&#xff0c;点击基本信息设置——处方配…

【JavaEE进阶】 代理模式

文章目录 &#x1f343;前言&#x1f38b;什么叫代理模式&#x1f334;静态代理&#x1f38d;动态代理&#x1f6a9;JDK动态代理&#x1f6a9;CGLIB动态代理 ⭕总结 &#x1f343;前言 前面对Spring AOP的详细使用进行了介绍&#xff0c;这篇博客博主将详细讲解一下Spring AOP…

使用统一功能完善图书管理系统

目录 一、前提 二、实现强制登陆传统方式 三、拦截器 1、概念 2、拦截器 &#xff08;1&#xff09;定义拦截器 &#xff08;2&#xff09;注册拦截器 &#xff08;3&#xff09;运行 3、使用拦截器实现强制登陆 4、DispatcherServlet源码解析 四、适配器模式 1、适…

深入剖析k8s-控制器思想

引言 本文是《深入剖析Kubernetes》学习笔记——《深入剖析Kubernetes》 正文 控制器都遵循K8s的项目中一个通用的编排模式——控制循环 for {实际状态 : 获取集群中对象X的实际状态期望状态 : 获取集群中对象X的期望状态if 实际状态 期望状态 {// do nothing} else {执行…

协议-http协议-基础概念03-http状态码-http特点-http性能-压缩和分块传输-范围请求

参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-状态码分类 开头的 Version 部分是 HTTP 协议的版本号&#xff0c;通常是HTTP/1.1&#xff0c;用处不是很大。后面的 Reason 部分是原因短语&#xff0c;是状态码的简短文字描述&#xff…

【计算机网络_应用层】TCP应用与相关API守护进程

需要云服务器等云产品来学习Linux的同学可以移步/–>腾讯云<–/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;优惠多多。&#xff08;联系我有折扣哦&#xff09; 文章目录 1. 相关使用接口2. 代码实现2.1 日志组件2.2 Server端2.3 Client端2.3 bug解决 3. 守…

c语言数据结构(5)——栈

欢迎来到博主的专栏——C语言数据结构 博主id&#xff1a;代码小豪 文章目录 栈栈的顺序存储结构栈的插入空栈的初始化栈的删除判断空栈读取栈顶元素数据 实现顺序栈的所有代码栈的链式存储结构链式栈的初始化链式栈的入栈操作链式栈的出栈操作 实现链式栈的所有代码 栈 栈是…

[微服务]Eureka注册中心

目录 1、引言 2、Eureka的结构和作用 2.1、图解 2.2、几个重要问题⭐ 3、搭建eureka-server 3.1.创建eureka-server服务 3.2、引入eureka依赖 3.3、编写启动类 3.4、编写配置文件 3.5、启动服务 4、服务注册(user) 4.1、引入依赖 4.2、配置文件 4.3、启动多个use…

python--练习题

1.python是一种&#xff08; &#xff09;类型的编程语言 A.机器语言 B.解释 C.编译 D.汇编语言 答案&#xff1a;B 2.python语言print(中国&#xff0c;你好)的输出是&#xff08;&#xff09; A.(中国&#xff0c;你好&#xff09; B.中国&#xff0c;你好 C.中国&#xff0c…