go流程控制

流程控制是每种编程语言控制逻辑走向和执行次序的重要部分,流程控制可以说是一门语言的“经脉”。

Go 语言中最常用的流程控制有 if 和 for,而 switch 和 goto 主要是为了简化代码、降低重复代码而生的结构,属于扩展类的流程控制。

if else(分支结构)

  1. if 条件判断基本写法

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

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

当表达式 1 的结果为 true 时,执行分支 1,否则判断表达式 2,如果满足则执行分支 2,都不满足时,则执行分支 3。 if 判断中的 else if 和 else 都是可选的,可以根据实际需要进行选择。

注意:Go 语言规定与 if 匹配的左括号{必须与 if 和表达式放在同一行,{放在其他位置会触发编译错误。 同理,与 else 匹配的{也必须与 else 写在同一行,else 也必须与上一个 if 或else if 右边的大括号在同一行。

代码示例:

package mainimport "fmt"func ifDemo(score int) {if score >= 90 {fmt.Println("A")} else if score > 75 {fmt.Println("B")} else {fmt.Println("C")}
}
func main() {ifDemo(65)
}
  1. if 条件判断特殊写法

if 条件判断还有一种特殊的写法,可以在 if 表达式之前添加一个执行语句,再根据变量值进行判断,

代码示例:

package mainimport "fmt"func ifDemo(score int) {if score := score; score >= 90 {fmt.Println("A")} else if score > 75 {fmt.Println("B")} else {fmt.Println("C")}}
func main() {ifDemo(65)
}

这种写法和上面的区别就是下面的score是局部作用域,除非有特别的需求需要在条件内部重新定义变量,否则这种写法个人并不推荐。

for(循环结构)

Go 语言中的所有循环类型均可以使用 for 关键字来完成。
for 循环的基本格式如下:

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

条件表达式返回 true 时循环体不停地进行循环,直到条件表达式返回 false 时自动退出循环。

代码示例:

package mainimport "fmt"func main() {for i := 0; i < 10; i++ {fmt.Println(i)}
}

for 循环的初始语句可以被忽略,但是初始语句后的分号必须要写,例如:

package mainimport "fmt"func main() {i := 0for ; i < 10; i++ {fmt.Println(i)}
}

for 循环的初始语句和结束语句都可以省略,例如:

package mainimport "fmt"func main() {i := 0for i < 10 {fmt.Println(i)i++}
}

这种写法类似于其他编程语言中的 while,在 while 后添加一个条件表达式,满足条件表达式时持续循环,否则结束循环。

注意:Go 语言中是没有 while 语句的,我们可以通过 for 代

for 无限循环结构:

for {
循环体语句
}

for 循环可以通过 break、goto、return、panic 语句强制退出循环。

代码示例:

package mainimport "fmt"func main() {k := 1for { // 这里也等价 for ; ; {if k <= 10 {fmt.Println("ok~~", k)} else {break //break 就是跳出这个 for 循环}k++}
}

for range(键值循环)

Go 语言中可以使用 for range 遍历数组、切片、字符串、map 及通道(channel)。 通过 for
range 遍历的返回值有以下规律:

  • 数组、切片、字符串返回索引和值
  • map 返回键和值
  • 通道(channel)只返回通道内的值

代码示例:

package mainimport "fmt"func main() {str := "abc 上海"for index, val := range str {fmt.Printf("index=%d, val=%c \n", index, val)}for _, val := range str {fmt.Printf("val=%c \n", val)}}

结果:

index=0, val=a 
index=1, val=b 
index=2, val=c 
index=3, val=  
index=4, val=上 
index=7, val=海 
val=a 
val=b 
val=c 
val=  
val=上 
val=海 

switch case

使用 switch 语句可方便地对大量的值进行条件判断,Go 语言规定每个 switch 只能有一个 default 分支。

代码示例:

package mainimport "fmt"func main() {extname := ".a"switch extname {case ".html":fmt.Println("text/html")breakcase ".css":fmt.Println("text/css")breakcase ".js":fmt.Println("text/javascript")breakdefault:fmt.Println("格式错误")break}
}

结果:

格式错误

Go 语言中每个 case 语句中可以不写 break,不加 break 也不会出现穿透的现象 如下例子:

package mainimport "fmt"func main() {extname := ".a"switch extname {case ".html":fmt.Println("text/html")case ".css":fmt.Println("text/css")case ".js":fmt.Println("text/javascript")default:fmt.Println("格式错误")}
}

结果仍然是:

格式错误

在Go语言中,break关键字在switch语句中的使用确实与C、C++或Java等传统编程语言有所不同。由于Go的switch语句默认情况下会在匹配并执行一个case后自动终止(即自动阻止“fall through”行为),因此大多数情况下你不需要也不应该使用break。
然而,这并不意味着break关键字在Go的switch语句中完全没有价值。实际上,break仍然可以在特定情境下使用,主要用于提前退出整个switch结构。例如,如果你在一个case中有复杂的逻辑判断,并且在某些条件下希望提前结束switch语句,可以使用break来实现这一点

一个分支可以有多个值,多个 case 值中间使用英文逗号分隔:

package mainimport "fmt"func main() {n := 2switch n {case 1, 3, 5, 7, 9:fmt.Println("奇数")case 2, 4, 6, 8:fmt.Println("偶数")default:fmt.Println(n)}
}

结果:

偶数
switch 的穿透 fallthrough

fallthrough`语法可以执行满足条件的 case 的下一个 case,是为了兼容 C 语言中的 case 设计的。

package mainimport "fmt"func switchDemo(s string) {switch {case s == "a":fmt.Println("a")fallthroughcase s == "b":fmt.Println("b")case s == "c":fmt.Println("c")default:fmt.Println("...")}
}
func main() {switchDemo("a")
}

结果:

a
b

break(跳出循环)

Go 语言中 break 语句用于以下几个方面:

  • 用于循环语句中跳出循环,并开始执行循环之后的语句
  • break 在 switch(开关语句)中在执行一条 case后跳出语句的作用
  • 在多重循环中,可以用标号 label 标出想 break 的循环
  1. switch(开关语句)中在执行一条 case 后跳出语句的作用
package mainimport "fmt"func main() {extname := ".html"switch extname {case ".html":fmt.Println("text/html")breakcase ".css":fmt.Println("text/css")breakcase ".js":fmt.Println("text/javascript")breakdefault:fmt.Println("格式错误")}
}

使用break可以在满足条件后就推出程序,不再继续执行后面的case了。

  1. for 循环中默认 break 只能跳出一层循环

代码示例:

package mainimport "fmt"func main() {for i := 0; i < 2; i++ {for j := 0; j < 10; j++ {if j == 2 {break}fmt.Println("i j 的值", i, "-", j)}}
}

结果:

i j 的值 0 - 0
i j 的值 0 - 1
i j 的值 1 - 0
i j 的值 1 - 1
  1. 在多重循环中,可以用标号 label 标出想 break 的循环

代码示例:

package mainimport "fmt"func main() {
label2:for i := 0; i < 2; i++ {for j := 0; j < 10; j++ {if j == 2 {break label2}fmt.Println("i j 的值", i, "-", j)}}
}

结果:

i j 的值 0 - 0
i j 的值 0 - 1

continue(继续下一次循环)

continue 语句可以结束当前循环,开始下一次的循环迭代过程,仅限在 for 循环内使用。

代码示例:

package mainimport "fmt"func main() {for i := 0; i < 2; i++ {for j := 0; j < 4; j++ {if j == 2 {continue}fmt.Println("i j 的值", i, "-", j)}}
}

结果:

i j 的值 0 - 0
i j 的值 0 - 1
i j 的值 0 - 3
i j 的值 1 - 0
i j 的值 1 - 1
i j 的值 1 - 3

在 continue 语句后添加标签时,表示开始标签对应的循环。例如:

package mainimport "fmt"func main() {
here:for i := 0; i < 2; i++ {for j := 0; j < 4; j++ {if j == 2 {continue here}fmt.Println("i j 的值", i, "-", j)}}
}

结果:

i j 的值 0 - 0
i j 的值 0 - 1
i j 的值 1 - 0
i j 的值 1 - 1

goto(跳转到指定标签)

goto 语句通过标签进行代码间的无条件跳转。goto 语句可以在快速跳出循环、避免重复退出上有一定的帮助。Go 语言中使用 goto 语句能简化一些代码的实现过程。

示例代码:

package mainimport "fmt"func main() {var n int = 30fmt.Println("ok1")if n > 20 {goto label1}fmt.Println("ok2")fmt.Println("ok3")fmt.Println("ok4")
label1:fmt.Println("ok5")fmt.Println("ok6")fmt.Println("ok7")
}

结果:

ok1
ok5
ok6
ok7

使用 goto 语句能简化代码:

package mainimport "fmt"func main() {for i := 0; i < 10; i++ {for j := 0; j < 10; j++ {if j == 2 {// 设置退出标签goto breakTag}fmt.Printf("%v-%v\n", i, j)}}return// 标签
breakTag:fmt.Println("结束 for 循环")
}

结果:

0-0
0-1
结束 for 循环

参考文献

https://go.dev/doc/tutorial/getting-started

https://gobyexample.com/

https://www.w3schools.com/go/

https://go.dev/doc/tutorial/

https://www.geeksforgeeks.org/golang-tutorial-learn-go-programming-language/

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

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

相关文章

基于Hexo实现一个静态的博客网站

原文首发&#xff1a;https://blog.liuzijian.com/post/8iu7g5e3r6y.html 目录 引言1.初始化Hexo2.整合主题Fluid3.部署评论系统Waline4.采用Nginx部署 引言 Hexo是中国台湾开发者Charlie在2012年创建的一个开源项目&#xff0c;旨在提供一个简单、快速且易于扩展的静态博客生…

足球俱乐部管理系统的设计与实现

&#x1f345;点赞收藏关注 → 添加文档最下方联系方式咨询本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345; 项目视频 足…

tolua[一]框架搭建,运行example

一.安装tolua https://github.com/topameng/tolua 下载LuaFramework_UGUI的zip 将Assets目录拷贝到项目根目录下 提示确认注册&#xff0c;遇到这个对话框点确定即可 生成如下目录 二.LuaFramework->Build Windows Resource 接下来的目标是将这个main场景跑起来 需要先执行…

JVM图文入门

往期推荐 【已解决】redisCache注解失效&#xff0c;没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…

Day37-【13003】短文,串的基本概念,匹配算法,算法时间复杂度,真题训练

文章目录 第二节 串串的基本概念串的模式匹配朴素的模式匹配算法(BF算法)算法最坏时间复杂度O(n x m) 改进的模式匹配算法(KMP算法)特征向量next&#xff0c;来确定k值特征向量next的算法实现 算法最坏时间复杂度O(n)进一步改进next值的计算&#xff0c;简化步骤 第四章真题真题…

GPU-Z重磅更新,Blackwell架构全面支持

由TechPowerUp倾力打造的GPU-Z&#xff0c;是一款集显卡信息查看、实时监控与深度诊断于一体的强大工具。它以其轻巧灵便的体积、完全免费的使用模式以及极其友好的操作界面&#xff0c;赢得了全球无数用户的青睐与信任&#xff0c;成为PC硬件领域中不可或缺的软件。 GPU-Z不仅…

leetCode刷题-图、回溯相关

岛屿数量 class Solution { private:int mi;int mj; public:int numIslands(vector<vector<char>>& grid) {mi grid.size() - 1; // i的范围 0~mimj grid[0].size() - 1; // j的范围 0~mjint landnum 0;bool sea false;do {pair<int, int> res …

VMware Win10下载安装教程(超详细)

《网络安全自学教程》 从MSDN下载系统镜像&#xff0c;使用 VMware Workstation 17 Pro 安装 Windows 10 consumer家庭版 和 VMware Tools。 Win10下载安装 1、下载镜像2、创建虚拟机3、安装操作系统4、配置系统5、安装VMware Tools 1、下载镜像 到MSDN https://msdn.itellyou…

基础篇05-直方图操作

本节将简要介绍Halcon中有关图像直方图操作的算子&#xff0c;重点介绍直方图获取和显示两类算子&#xff0c;以及直方图均衡化处理算子。 目录 1. 引言 2. 获取并显示直方图 2.1 获取&#xff08;灰度&#xff09;直方图 (1) gray_histogram (2) gray_histo_abs (3) gr…

Oracle(windows安装遇到的ORA-12545、ORA-12154、ORA-12541、ORA-12514等问题)

其实出现该问题就是监听或者服务没有配好。 G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\dbhome_1\NETWORK\ADMINlistener.ora SID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME CLRExtProc)(ORACLE_HOME G:\xiaowangzhenshuai\software\Oracle\product\11.2.0\d…

LabVIEW2025中文版软件安装包、工具包、安装教程下载

下载链接&#xff1a;LabVIEW及工具包大全-三易电子工作室http://blog.eeecontrol.com/labview6666 《LabVIEW2025安装图文教程》 1、解压后&#xff0c;双击install.exe安装 2、选中“我接受上述2条许可协议”&#xff0c;点击下一步 3、点击下一步&#xff0c;安装NI Packa…

在本地顺利的部署一个al模型从零开始 windows

引言 &#xff08;踩的坑&#xff0c;省流引言的内容没有有使模型跑起来&#xff09; 最近想在本地部署一个deepseek模型&#xff0c;就在网上搞了3 4天终于是能够部署下来了&#xff0c;在部署的时候也是成功的踩了无数的坑&#xff0c;比如我先问al如何在本地部署一个语言模…

基于ansible部署elk集群

ansible部署 ELK部署 ELK常见架构 &#xff08;1&#xff09;ElasticsearchLogstashKibana&#xff1a;这种架构是最常见的一种&#xff0c;也是最简单的一种架构&#xff0c;这种架构通过Logstash收集日志&#xff0c;运用Elasticsearch分析日志&#xff0c;最后通过Kibana中…

Linux学习笔记16---高精度延时实验

延时函数是很常用的 API 函数&#xff0c;在前面的实验中我们使用循环来实现延时函数&#xff0c;但是使用循环来实现的延时函数不准确&#xff0c;误差会很大。虽然使用到延时函数的地方精度要求都不会很严格( 要求严格的话就使用硬件定时器了 ) &#xff0c;但是延时函数肯定…

Linux系统 环境变量

环境变量 写在前面概念查看环境变量main函数的参数argc & argvenv bash环境变量 写在前面 对于环境变量&#xff0c;本篇主要介绍基本概念及三四个环境变量 —— PATH、HOME、PWD。其中 PATH 作为 “ 敲门砖 ”&#xff0c;我们会更详细讲解&#xff1b;理解环境变量的全局…

旋转变压器工作及解调原理

旋转变压器 旋转变压器是一种精密的位置、速度检测装置&#xff0c;广泛应用在伺服控制、机器人、机械工具、汽车、电力等领域。但是&#xff0c;旋转变压器在使用时并不能直接提供角度或位置信息&#xff0c;需要特殊的激励信号和解调、计算措施&#xff0c;才能将旋转变压器…

【漫话机器学习系列】076.合页损失函数(Hinge Loss)

Hinge Loss损失函数 Hinge Loss&#xff08;合页损失&#xff09;&#xff0c;也叫做合页损失函数&#xff0c;广泛用于支持向量机&#xff08;SVM&#xff09;等分类模型的训练过程中。它主要用于二分类问题&#xff0c;尤其是支持向量机中的优化目标函数。 定义与公式 对于…

基于docker搭建Kafka集群,使用KRaft方式搭建,摒弃Zookeeper

KAFKA基于docker使用KRaft进行集群搭建 环境&#xff1a;已成功搭建kafka服务 可点击链接跳转至安装kafka-3.8.0版本 并启用SASL认证 教程 使用基于Zookeeper方式搭建集群教程 kafka-3.8.0版本 并启用SASL认证 教程 搭建kafka-ui可视化工具 192.168.2.91 192.168.2.92 192…

Go 语言 | 入门 | 快速入门

快速入门 1.第一份代码 先检查自己是否有正确下载 Go&#xff0c;如果没有直接去 Go 安装 进行安装。 # 检查是否有 Go $ go version go version go1.23.4 linux/amd64然后根据 Go 的入门教程 开始进行学习。 # 初始化 Go 项目 $ mkdir example && cd example # Go…

凝思60重置密码

凝思系统重置密码 - 赛博狗尾草 - 博客园 问题描述 凝思系统进入单用户模式&#xff0c;在此模式下&#xff0c;用户可以访问修复错误配置的文件。也可以在此模式下安装显卡驱动&#xff0c;解决和已加载驱动的冲突问题。 适用范围 linx-6.0.60 linx-6.0.80 linx-6.0.100…