Golang 【basic_leaming】3 流程控制

news/2024/5/10 8:23:18/文章来源:https://blog.csdn.net/weiguang102/article/details/128401757

阅读目录

  • Go 语言 if else (条件判断)
    • Go 语言 if else 条件判断代码示例
    • if 的特殊写法
  • Go 语言 for(循环)
    • for 循环 - 初始语句
    • for 循环 - 条件表达式
      • 1 更美观的死循环写法
      • 2 只有一个条件的 for 循环
    • for 循环 - 结束语句
  • Go 语言 for range (键值循环)
    • for range 遍历数组、切片、字符串
    • for range 遍历 map 字典
    • for range 遍历通道(channel)
    • for range 中使用匿名变量
  • Go 语言 switch 语句(分支判断)
    • 1 基本写法
    • 2 一分支多值
    • 3 分支表达式
    • 4 fallthrough 关键字 —— 兼容 C 语言的 case 设计
  • Go 语言 goto 语句(代码跳转)
    • 1 使用 goto 跳出循环
    • 2 避免定义重复代码
  • Go 语言 break 语句(跳出循环)
    • break 跳出代码块 - 退出多层循环
  • Go 语言 continue 语句(继续下次循环)
  • 参考文献

Go 语言 if else (条件判断)

Go 语言 中,if else 条件判断格式如下:

if 表达式1 {分支1
} else if 表达式2 {分支2
} else {分支3
}

①:当表达式 1 的结果为 true 时,会执行分支 1 的代码;
②:当表达式 1 的结果为 false 时,会执行表达式2,若结果为 true, 则会执行分支2的代码。
③:当前面的条件都不满足,即都为 false 时,会执行分支3的代码。

PS:表达式2、分支2 、分支3都是可选的,可以根据实际情况自行选择。

注意:Go 语言中规定:if 的 左括号 ‘’{‘’ 必须与 if 表达式放在同一行,如果强行放置在其他位置,会发生如下编译错误。

下面是代码反例,编译报错图示:

在这里插入图片描述

同理,与 else 匹配的 “{” 也必须与 else 放置在同一行, else 也必须与上一个 if 或 else if 的右边的大括号放在同一行。

Go 语言 if else 条件判断代码示例

下面是一段正确的 if else 条件判断示例:

package mainimport "fmt"func main() {// 定义一个字符串str := "wgchen.blog.csdn.net"// 获取该字符串的实际长度len := len(str)// 判断字符串的长度是否等于14if len == 14 {// 若等于14fmt.Println("长度等于 14")} else {// 若不等于14fmt.Println("长度不等于 14")}
}
PS E:\golang\src> go run .\main.go
长度不等于 14
PS E:\golang\src>

if 的特殊写法

if 还有种特殊写法,我们可以在 if 表达式之前添加一个执行语句,再根据变量 进行判断,代码如下:

if err := Connect(); err != nil {fmt.Println(err)return
}

Connect() 是一个获取数据库连接的函数,它带有返回值,err := Connect() 是一个语句,执行 Connect() 函数后,将错误赋值给 err 变量。

err != nil 是 if 的条件判断表达式,当 err 不为空时,打印错误并返回。

这种写法可以将返回值和判断放在一行进行处理,使得返回值的作用域范围被限制在了 if else 语句组合中,这样做的好处是,变量的作用域范围越小,那么它可能造成的问题的可能性越小,这对代码的稳定性很有帮助,另外,也可以做炫技使用。

Go 语言 for(循环)

在 Go 语言 中,循环需要使用关键字 for 来完成,格式如下:

for 初始语句;条件表达式;结束语句 {循环体代码
}

for 循环会不停地进行循环,直到 条件表达式 返回 false 才推出循环,即执行 for 循环 "}" 后面的代码。

for 循环 - 初始语句

初始语句是第一次执行循环前执行的语句,通常情况下,我们会通过它来执行变量初始化操作。

注意: 通过初始语句声明的变量,作用域局限在 for 循环内。

代码如下:

package mainimport "fmt"func main() {for i := 0; i < 100; i++ {fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")}
}

在这里插入图片描述
上面代码打印了一百次知其黑,受其白 wgchen.blog.csdn.net。

另外,初始语句还可以忽略不写,但是初始语句后面的分号必须写,代码如下:

i := 0
for ; i < 100; i++ {fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")
}

上面的代码中将 i 放在了 for 循环前面初始化,这时 i 的作用域不止作用在 for 循环内。

for 循环 - 条件表达式

每次在循环前,会计算条件表达式的值,如果结果为 true, 则继续循环;

否则将结束循环。

注意:条件表达式同样可以忽略不写,若不写,由于没有终止条件,则会陷入无限死循环,代码如下:

i := 0
for ; ; i++ {if i == 10 {break}fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")
}

上面代码打印 10 次:知其黑,受其白 wgchen.blog.csdn.net

不是说死循环吗?
怎么只打印了 10 呢?

之所以只打印 10 次,因为循环体中有 if 判断语句,当 i 等于 10 时,执行了 break 结束循环的操作。

1 更美观的死循环写法

还有死循环的写法更具有可读性,代码如下:

i := 0
for {if i == 10 {break}fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")
}

可以看到, for 后面直接忽略了初始语句、条件表达式以及结束语句。

2 只有一个条件的 for 循环

上面的代码还可以进一步简化,可以将 if 判断整合到 for 循环中,代码如下:

i := 0
for i <= 10 {i++fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")
}

将条件 i == 10 条件改成了 i <= 10, 并整合到 for 后面,若满足条件则会打印控制台,且每次对 i 执行自增加一操作。

for 循环 - 结束语句

在结束每次循环前被执行的语句。若循环被 break 、goto 、return 、panic 等语句强制退出,则结束语句不会被执行。

Go 语言 for range (键值循环)

Go 语言 中,我们还可以通过 for range 来遍历数组 、切片 、字符串 、map 以及通道(channel)。

for range 遍历数组、切片、字符串

通过 for range 遍历数组、切片、字符串的返回值都有一个规律:

  • 下标索引 index;
  • 下标对应的值 value;

下面代码演示了如何遍历切片,数组格式类似:

package mainimport "fmt"func main() {// 初始化一个切片slice := []int{1, 2, 3, 4}// 通过 for range 循环切片for index, value := range slice {fmt.Printf("index: %d, value: %d\n", index, value)}
}
PS E:\golang\src> go run .\main.go
index: 0, value: 1
index: 1, value: 2
index: 2, value: 3
index: 3, value: 4
PS E:\golang\src>

下面代码演示了如何遍历字符串:

package mainimport "fmt"func main() {str := "知其黑,受其白 wgchen.blog.csdn.net"// 通过 for range 循环字符串for index, value := range str {fmt.Printf("index: %d, value: 0x%x\n", index, value)}}
PS E:\golang\src> go run .\main.go
index: 0, value: 0x77e5
index: 3, value: 0x5176
index: 6, value: 0x9ed1
index: 9, value: 0xff0c
index: 12, value: 0x53d7
index: 15, value: 0x5176
index: 18, value: 0x767d
index: 21, value: 0x20
index: 22, value: 0x77
index: 23, value: 0x67
index: 24, value: 0x63
index: 25, value: 0x68
index: 26, value: 0x65
index: 27, value: 0x6e
index: 28, value: 0x2e
index: 29, value: 0x62
index: 30, value: 0x6c
index: 31, value: 0x6f
index: 32, value: 0x67
index: 33, value: 0x2e
index: 34, value: 0x63
index: 35, value: 0x73
index: 36, value: 0x64
index: 37, value: 0x6e
index: 38, value: 0x2e
index: 39, value: 0x6e
index: 40, value: 0x65
index: 41, value: 0x74
PS E:\golang\src>

上面代码中的 value 变量实际类型是 runne, 本质上是 int32, 以十六进制格式打印出来的是字符串编码。

for range 遍历 map 字典

通过 for range 遍历 map 字典会返回键和值,称为键值对,它们总是一对一出现,演示代码如下:

package mainimport "fmt"func main() {m := map[int]string{1: "知其黑,受其白",2: "wgchen.blog.csdn.net",}for key, value := range m {fmt.Printf("key: %d, value: %s\n", key, value)}
}
PS E:\golang\src> go run .\main.go
key: 1, value: 知其黑,受其白
key: 2, value: wgchen.blog.csdn.net
PS E:\golang\src>

注意: 对 map 字典进行遍历时,遍历出的键值对是无序的,如果需要有序输出,需要先排序。

for range 遍历通道(channel)

for range 遍历通道(channel)有点不同,此时只会输出一个值,即管道内的类型对应的数据

下面代码演示了如何遍历通道(channel):

package mainimport "fmt"func main() {// 初始化一个通道c := make(chan int)// 启动一个 goroutine, 功能是往通道中推送数据 1、2、3,然后关闭通道go func() {c <- 1c <- 2c <- 3close(c)}()for value := range c {fmt.Println(value)}
}

注意: goroutine 在启动结束后,会被立刻并行执行。关于 goroutine,后面小节会详细介绍,这里只做了解。

PS E:\golang\src> go run .\main.go
1
2
3
PS E:\golang\src>

for range 中使用匿名变量

假设说在 for range 遍历中只想获取下标索引,或者是值要怎么做呢?

比较优雅的写法是通过匿名变量。

什么是匿名变量?

1、它可以理解成一种占位符;
2、这种变量不会分配内存,也不会占用变量名;
3、在 for range 中,可以通过匿名变量接受键 key,也可以接受值 value。

下面代码演示了如果通过匿名变量来接受 key, 循环体中只打印了值 value。

package mainimport "fmt"func main() {m := map[int]string{1: "知其黑,受其白",2: "wgchen.blog.csdn.net",}for _, value := range m {fmt.Printf("value: %s\n", value)}
}
PS E:\golang\src> go run .\main.go
value: 知其黑,受其白
value: wgchen.blog.csdn.net
PS E:\golang\src>

Go 语言 switch 语句(分支判断)

分支判断可以理解成批量的 if 语句,使用 switch 语句可以非常方便地对大量值进行条件判断。

1 基本写法

Go 语言 改进了其他语言中 switch 语句的设计弊端。Go 语言中 switch 中的每一个 case 都是独立代码块,无需通过 break 语句跳出代码块,以避免执行到下一个 case 代码块。

PS: 如果你有其他语言的编程经验 (如 Java), 一定会对 case 代码块中的 break 语句印象深刻。

swtich 语句的基本格式如下:

package mainimport "fmt"func main() {num := 1switch num {case 1:fmt.Println("1 -> 知其黑 wgchen")case 2:fmt.Println("2 -> 受其白 blog.csdn.net")default:fmt.Println("error")}
}
PS E:\golang\src> go run .\main.go
1 -> 知其黑 wgchen
PS E:\golang\src>

上面代码中,case 对整型 num 进行判断,若条件符合,则打印相应的字符串 。

另外,还使用了 default 分支,default 分支表示若条件均不符合,则执行改代码块。

注意:每一个 swtich 语句中只能有一个 default 分支。

2 一分支多值

当需要多个 case 放在一起的时候,代码格式如下:

package mainimport "fmt"func main() {num := 1switch num {case 1, 2:fmt.Println("知其黑 blog.csdn.net")}}
PS E:\golang\src> go run .\main.go
知其黑 blog.csdn.net
PS E:\golang\src>

表达式直接用逗号 , 隔开即可。

3 分支表达式

case 后面除了定义常量以外,还可以像 if 语句一样添加表达式,代码如下:

package mainimport "fmt"func main() {num := 1switch {case num > 0 && num < 2:fmt.Println("知其黑 blog.csdn.net")}
}
S E:\golang\src> go run .\main.go
知其黑 blog.csdn.net
PS E:\golang\src>

注意: 这个时候,switch 后面不再跟判断变量,直接不写即可。

4 fallthrough 关键字 —— 兼容 C 语言的 case 设计

前面说到了 Go 语言中 swtich 语句中的 case 均为独立代码块,执行完成后,不会像 C 语言那种继续执行下一个 case。

但是为了兼容一些移植代码,Go 语言加入了 fallthrough 关键字来实现这一功能。

实例代码如下:

package mainimport "fmt"func main() {num := 1switch {case num > 0:fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")fallthroughcase num < 2:fmt.Println("知其黑,受其白 wgchen.blog.csdn.net")}
}
PS E:\golang\src> air__    _   ___/ /\  | | | |_)
/_/--\ |_| |_| \_ , built with Gowatching .
watching resources
watching resources\views
watching resources\views\articles
!exclude tmp
building...
running...
知其黑,受其白 wgchen.blog.csdn.net
知其黑,受其白 wgchen.blog.csdn.net

Go 语言 goto 语句(代码跳转)

在 Go 语言 中,goto 语句通过标签实现代码间的跳转。
它通常会被使用在快速跳出循环 、避免定义重复代码等。

1 使用 goto 跳出循环

package mainimport "fmt"func main() {// 外循环for i := 0; i < 10; i++ {// 内循环for j := 0; j < 10; j++ {// 当 j 等于 2 时,跳转到标签 breakHere 那里if j == 2 {// 跳转标签goto breakHere}}}// 手动返回,防止执行后面的标签return// 定义一个标签
breakHere:fmt.Println("跳到这里 ...")
}
building...
running...
跳到这里 ...

2 避免定义重复代码

在实际的编码中,经常会定义一些重复性的代码,如下:

在这里插入图片描述
上面的这段明显有重复代码,我们可以 goto 定义标签来使代码变的更加优雅一点:

在这里插入图片描述

Go 语言 break 语句(跳出循环)

在 Go 语言 中,break 语句可以结束 for 、switch 和 select 代码块。

下面代码演示了 break 语句跳出单层循环:

package mainimport "fmt"func main() {// 外循环for i := 0; i < 10; i++ {fmt.Printf("i: %d\n", i)// 当 i 等于 6 时,跳转到循环if i == 6 {// 跳出循环break}}fmt.Println("跳出循环 ...")
}
i: 0
i: 1
i: 2
i: 3
i: 4
i: 5
i: 6
跳出循环 ...

上面代码,当循环到 6 时,通过 break 语句跳出循环。

break 跳出代码块 - 退出多层循环

通过 break 语句搭配标签可以跳出代码块,如跳出 for 、switch 和 select 代码块。

下面的代码演示了如何通过 break 跳出多层循环,代码如下:

package mainimport "fmt"func main() {OuterLoop:// 外循环for i := 0; i < 10; i++ {fmt.Printf("i: %d\n", i)// 内循环for j := 0; j < 10; j++ {fmt.Printf("j: %d\n", j)if i == 0 && j == 6 {// 跳出 OuterLoop 代码块break OuterLoop}}}fmt.Println("跳出循环 ...")
}

Go 语言 continue 语句(继续下次循环)

在 Go 语言 中,continue 语句可以结束当前 for 循环 ,进入下一次 for 循环, 代码如下:

package mainimport "fmt"func main() {for i := 0; i < 10; i++ {// 当 i 等于 2 时,执行 continue 语句,继续下一次循环if i == 2 {continue}fmt.Printf("i: %d\n", i)}
}
running...
i: 0
i: 1
i: 3
i: 4
i: 5
i: 6
i: 7
i: 8
i: 9

可以看到并没有打印 2, 那是因为当循环到 i 等于 2 时,直接执行了 continue 语句,继续了下一循环。

另外,我们还可以在 continue 语句后添加标签,表示开始标签处的循环:

package mainimport "fmt"func main() {OuterLoop:// 外循环for i := 0; i < 3; i++ {// 内循环for j := 0; j < 3; j++ {// 当 j 等于 1 时,执行 continue 语句跳转到 OuterLoop 标签处,即跳出至外循环,而不是内循环if j == 1 {continue OuterLoop}fmt.Printf("i: %d, j: %d\n", i, j)}}
}
building...
running...
i: 0, j: 0
i: 1, j: 0
i: 2, j: 0

代码中,当 j 等于 1 时,会执行 continue 语句直接跳转到 OuterLoop 标签处,即跳出至外循环继续,而不是内循环。

参考文献

Golang 【basic_leaming】流程控制

在这里插入图片描述

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

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

相关文章

【工作流Activiti7】4、Activiti7 结束/终止流程

1. 结束/终止 正在运行的流程实例 思路&#xff1a;跟回退一样的思路一样&#xff0c;直接从当前节点跳到结束节点&#xff08;EndEvent&#xff09; /*** 结束任务* param taskId 当前任务ID*/ public void endTask(String taskId) {// 当前任务Task task taskService…

02:损失函数总结

目录 nn.L1Loss: nn.NLLLoss: nn.MSELoss: nn.CrossEntropyLoss: 损失函数是用来估量模型的预测值与真实值的不一致程度&#xff0c;它是一个非负实值函数。我们训练模型的过程&#xff0c;就是通过不断的迭代计算&#xff0c;使用梯度下降的优化算法&#xff0c;使得损失函…

为什么编程入门从Python学起?

目前&#xff0c;青岛市的小学、初中、高中对于编程教育和信息学的推进几乎都选中了Python。 浙江省新高中信息技术教材改革项目中&#xff0c;高中新生开始使用新教材&#xff0c;里面的编程语言将换用 Python&#xff0c;Python 将正式纳入高考内容。 Python是一种代表简单主…

【综合】简单加解密——寻找序列号

【综合】简单加解密——寻找序列号 下面文字对你可能有用(复制粘贴): #include <stdlib.h> #include <string.h> #include “malloc.h” #define MaxPass 66 // 最多66段密文 #define NumbPwdTable 5 // 密码表的份数 #define SizePwdTable 0x210 // 每份密码表占…

雷军主导小米管理层变革:创业派隐退 职业经理人上位

雷递网 雷建平 12月23日岁末之际&#xff0c;在京东零售大幅调整后&#xff0c;小米也进行了一轮大调整。小米集团内部邮件所示&#xff0c;小米总裁王翔将在月底卸任集团总裁职务退休&#xff0c;同时&#xff0c;继续作为高级顾问为公司服务。小米集团总裁一职将由2019年加入…

互联网行业逐步回暖!就业显示有74%学员跨专业学编程!

三年以来&#xff0c;居家办公、隔离等影响已深入每个人的生活。就业形势承受着巨大的压力&#xff0c;同时就业环境也发生巨大变化&#xff0c;越来越多的人都面临转行&#xff01; 达妹被问到最多的问题是&#xff1a; 跨专业学编程的疑虑 非科班出身零基础能学会编程吗? 数…

【源码共读】Vue2 中为什么可以使用 this 访问各种选项中的属性?

如何阅读源码 网上有很多关于源码阅读的文章&#xff0c;每个人都有自己的方式&#xff0c;但是网上的文章都是精炼之后的&#xff0c;告诉你哪个文件、那个函数、那个变量是干什么的&#xff1b; 但是没有告诉你这些是怎么找到的&#xff0c;这些是怎么理解的&#xff0c;这…

基于Vue+SpringBoot智慧校园疫情防控系统(PC端、手机端)--附源码

介绍 智慧校园疫情防控系统——PC 手机端 多端并行 项目源码下载&#xff1a;https://download.csdn.net/download/DeepLearning_/87340321 软件架构 手机端信息系统——日常健康信息填报系统&#xff08;前端手机端 文件夹&#xff09;电脑端智疫图 —— 数据可视化界面 &…

前端(htmlCSSJavaScript)基础

关于前端更多知识请关注官网&#xff1a;w3school 在线教程全球最大的中文 Web 技术教程。https://www.w3school.com.cn/ 1.HTML HTML(HyperText Markup Language)&#xff1a;超文本标记语言 超文本&#xff1a;超越了文本的限制&#xff0c;比普通文本更强大。除了文字信息…

嘿ChatGPT,来帮我写代码

最近 ChatGPT 发行了&#xff0c;这是由 OpenAI 开发的AI聊天机器人&#xff0c;专门研究对话。它的目标是使AI系统更自然地与之互动&#xff0c;但是在编写代码时也可以为您提供帮助。您可以让 ChatGPT 做你的编程助理&#xff0c;甚至更多&#xff01;在过去的几天里&#xf…

小布助手,身入大千世界

在2018年—2019年&#xff0c;AI智能助手一度火热&#xff0c;成了科技行业的全新风口。智能音箱与手机中&#xff0c;我们能看到各种各样的智能助手横空出世&#xff0c;一度成为产品标配。但随着时间缓缓冲刷&#xff0c;就像所有科技风口一样&#xff0c;有的AI智能助手随着…

可以做抽奖活动的微信小程序在哪里做_分享抽奖活动小程序制作步骤

越来越多的企业开始了解微信抽奖游戏的实用性和价值&#xff0c;因为用户更喜欢简单有趣的游戏抽奖方式&#xff0c;如大转盘、摇一摇、抢福袋、砸金蛋、摇一摇、刮刮卡等互动抽奖游戏。 如果企业想制作这种抽奖游戏&#xff0c;都倾向使用市场上的各种抽奖制作软件&#xff0c…

Bloom filter-based AQM 和 BBR 公平性

设 B 为 Delivery rate&#xff0c;D 为 Delay&#xff0c;将 E B/D 作为衡量效能&#xff0c;所有流量的收敛状态是一个 Nash 均衡&#xff0c;没有任何流量有动机增加或者减少 inflight。参见&#xff1a;更合理的 BBR。 并不是都知道这道理&#xff0c;增加 inflight 能挤…

【Java 数据结构】-二叉树OJ题

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的博客&#x1f319; 专栏&#xff1a;【Java 数据结构】 分享&#xff1a;宇宙的最可理解之处在于它是不可理解的&#xff0c;宇宙的最不可理解之处在于它是可理解的。——《乡村教师》 主要内容&#xff1a;二叉树的…

一维树状数组

引入 树状数组和线段树具有相似的功能&#xff0c;但他俩毕竟还有一些区别&#xff1a;树状数组能有的操作&#xff0c;线段树一定有&#xff1b;线段树有的操作&#xff0c;树状数组不一定有。但是树状数组的代码要比线段树短&#xff0c;思维更清晰&#xff0c;速度也更快&a…

雷神科技在北交所上市首日破发:上半年业绩下滑,路凯林为董事长

12月23日&#xff0c;青岛雷神科技股份有限公司&#xff08;下称“雷神科技”&#xff0c;BJ:872190&#xff09;在北京证券交易所&#xff08;即北交所&#xff09;上市。本次上市&#xff0c;雷神科技的发行价为25.00元/股&#xff0c;发行数量为1250万股&#xff0c;发行后总…

目标检测之Fast RCNN概述

基本原理 Fast Rcnn主要步骤为 利用SR算法生成候选区域利用VGG16网络进行特征提取利用第一步生成的候选区域在特征图中得到对应的特征矩阵利用ROI pooling将特征矩阵缩放到相同大小并平展得到预测结果 相对于RCNN的优化 主要有三个改进 不再将每一个候选区域依次放入CNN网络…

el-Dropdown 两个下拉框之间的动态绑定 实现默认选中值

目录 业务场景 官方链接 实现效果 使用框架 代码展示 template代码 script代码 变量定义 事件定义 onMounted事件 courseClass事件--课程班级绑定 defaultValue事件 optionChange事件 changeClass事件 为什么要给课程的每个选项也绑定click事件&#xff1f;作用是什么…

文字对称中的数学与魔术(二)——英文字母到单词的对称性

早点关注我&#xff0c;精彩不错过&#xff01;在上一篇文章中&#xff0c;我们引入了语言文字对称性这个领域&#xff0c;重点介绍了阿拉伯数字的对称性&#xff0c;相关内容请戳&#xff1a;文字对称中的数学与魔术&#xff08;一&#xff09;——阿拉伯数字的对称性今天我们…

el-pagination 动态切换每页条数、页数切换

目录 业务场景 官方链接 实现效果 使用框架 代码展示 template代码 script代码 变量定义 事件定义 handleSizeChange事件--实现每页条数改变表格动态变化 handleCurrentChange事件--切换页码 css代码 完整代码 总结 业务场景 当表格中的数据量如果非常庞大的时候我们…