Golang流程控制语句

文章目录

  • 顺序控制
  • 分支控制
    • if语句
    • switch语句
  • 循环控制
    • for循环语句
  • 跳转控制
    • break语句
    • continue语句
    • goto语句
    • return语句

顺序控制

顺序控制

默认情况下,Go代码执行顺序是按照从上到下依次执行的,这种按照顺序执行的代码就叫做顺序语句。如下:

package main

import "fmt"

func main() {
	// 顺序控制
	fmt.Println("statement 1...")
	fmt.Println("statement 2...")
	fmt.Println("statement 3...")
}

分支控制

if语句

if语句

Go中if语句的基本语法如下:

在这里插入图片描述

使用案例如下:

package main

import "fmt"

func main() {
	// if语句
	var num1, num2 int = 10, 20
	if num1 > num2 {
		fmt.Println("num1 > num2")
	} else if num1 < num2 {
		fmt.Println("num1 < num2")
	} else {
		fmt.Println("num1 = num2")
	}
}

说明一下:

  • 执行if语句时,会依次判断各个条件表达式,找到第一个结果为true的if分支并执行对应的代码块,如果所有条件表达式都不成立,则执行最后的else代码块。
  • if语句中的else if分支可以有一个或多个,最后的else分支是可选的,if语句支持嵌套。
  • 每一个if分支的{}都是必须的,就算代码块中只有一行代码也不能省略,否则会产生报错。
  • if语句中的条件表达式不需要用()包裹,虽然加上也不会报错,但是不建议这样做。
  • if语句的条件表达式不能是赋值语句,比如if flag = false,否则会产生报错。

if后声明变量

if语句支持在if后声明一个变量,并以分号结束,然后在分号后面再给出条件表达式。如下:

package main

import "fmt"

func main() {
	// if后声明变量
	var num = 10
	if base := 20; num < base {
		fmt.Println("num < base")
	}
}

注意: 在if后声明的变量仅在if语句中有效。

switch语句

switch语句

Go中switch语句的基本语法如下:

在这里插入图片描述

使用案例如下:

package main

import "fmt"

func main() {
	// switch语句
	var year, month int = 2024, 4
	switch month {
	case 1, 3, 5, 7, 8, 10, 12:
		fmt.Println("这个月有31天")
	case 4, 6, 9, 11:
		fmt.Println("这个月有30天")
	case 2:
		day := 28
		if (year%4 == 0 && year%100 != 0) || (year%400 == 0) {
			day++
		}
		fmt.Printf("这个月有%d天\n", day)
	default:
		fmt.Println("无效月份!")
	}
}

说明一下:

  • 执行switch语句时,会将表达式依次与各个case后的表达式进行比较,如果匹配成功,则执行对应case的代码块,如果所有case后的表达式都不匹配,则执行最后的default代码块,最后的default是可选的。
  • switch语句中的case可以有多个,并且每个case后可以带多个表达式,表达式之间使用逗号分隔。程序执行完case语句的代码块后会直接退出switch控制,不需要在代码块最后加break语句。
  • switch和case后面的表达式可以是常量值、变量、有返回值的函数调用等,case后的表达式如果是常量值(字面量),则要求不能重复。case后的各个表达式的值的数据类型,必须和switch后的表达式的数据类型一致。

switch后声明变量

switch语句支持在switch后声明一个变量,并以分号结束,然后在分号后面再给出表达式。如下:

package main

import "fmt"

func main() {
	// switch后声明变量
	switch year, month := 2024, 4; month {
	case 1, 3, 5, 7, 8, 10, 12:
		fmt.Println("这个月有31天")
	case 4, 6, 9, 11:
		fmt.Println("这个月有30天")
	case 2:
		day := 28
		if (year%4 == 0 && year%100 != 0) || (year%400 == 0) {
			day++
		}
		fmt.Printf("这个月有%d天\n", day)
	default:
		fmt.Println("无效月份!")
	}
}

注意: 在switch后声明的变量仅在switch语句中有效。

switch穿透

在执行完对应的case语句的代码块后,程序会直接退出switch控制,如果希望程序继续执行下一个case语句的代码块,可以在代码块的最后通过fallthough关键字实现switch穿透。如下:

package main

import "fmt"

func main() {
	// switch穿透
	var num int = 2
	switch num {
	case 1:
		fmt.Println("case 1 block...")
	case 2:
		fmt.Println("case 2 block...")
		fallthrough // 继续执行下一个case的代码块
	case 3:
		fmt.Println("case 3 block...")
	default:
		fmt.Println("default block...")
	}
}

注意: switch穿透默认只会穿透一层,如果希望执行下面更多case的代码块,需要再次穿透。

Type Switch

switch语句可以用于判断某个interface变量实际指向的变量类型,然后根据不同的类型执行相应的代码逻辑。如下:

package main

import "fmt"

func main() {
	// Type Switch
	var num int = 10
	var x interface{} = num
	switch t := x.(type) {
	case int:
		fmt.Println("int类型")
	case float64:
		fmt.Println("float64类型")
	case string:
		fmt.Println("string类型")
	default:
		fmt.Printf("未处理类型: %T\n", t)
	}
}

说明一下:

  • interface{}叫做空接口类型,其可以接收任意类型的变量值,在必要时需要通过类型断言的方式获取到变量原本的类型,而Type Switch就是一种类型断言的方式。

无表达式的switch

switch语句后可以不带表达式,这时在case后放条件表达式可以达到if语句的效果。如下:

package main

import "fmt"

func main() {
	// 无表达式的switch
	var num1, num2 int = 10, 20
	switch {
	case num1 > num2:
		fmt.Println("num1 > num2")
	case num1 < num2:
		fmt.Println("num1 < num2")
	default:
		fmt.Println("num1 = num2")
	}
}

说明一下:

  • 这里每个case后也可以带多个条件表达式,表达式之间使用逗号分隔。

循环控制

for循环语句

for循环语句

Go中for循环语句的基本语法如下:

在这里插入图片描述

使用案例如下:

package main

import (
	"fmt"
)

func main() {
	// for循环语句
	for i := 1; i <= 10; i++ {
		fmt.Printf("%d ", i)
	}
	fmt.Println()
}

说明一下:

  • 在执行for循环语句时,会先执行循环遍历初始化的语句,然后不断根据循环条件判断是否执行循环体操作,如果循环条件为真则执行一次循环体操作并进行一次循环变量迭代,如果循环条件为假则退出for循环。

for循环的其他用法

在使用for循环语句时,可以只在for后指明循环条件,而将循环变量的初始化和循环变量的迭代放在其他位置。如下:

在这里插入图片描述

使用案例如下:

package main

import (
	"fmt"
)

func main() {
	// for循环语句
	i := 1
	for i <= 10 {
		fmt.Printf("%d ", i)
		i++
	}
	fmt.Println()
}

在使用for循环语句时,以for{}for ; ; {}表示无限循环,通常需要配合break语句使用。如下:

在这里插入图片描述

使用案例如下:

package main

import (
	"fmt"
)

func main() {
	// for循环语句
	for {
		fmt.Println("这是一个死循环...")
		time.Sleep(time.Second)
	}
}

说明一下:

  • Sleep是time包中的一个函数,用于阻塞当前goroutine指定时间,其参数的类型是Duration。
  • Second是time包中的一个Duration类型的常量,表示1秒。

for range循环

Go中的for range循环,可以方便的对string、数组、切片、map等数据类型中的元素进行遍历。如下:

package main

import (
	"fmt"
)

func main() {
	// for range循环
	var s string = "Hello 世界"
	for index, value := range s {
		fmt.Printf("s[%d] = %c\n", index, value)
	}
}

在使用for range遍历string时,它会按照UTF-8编码格式解析字符串,并以Unicode字符作为迭代的单位,每次迭代都会返回字符串中的一个Unicode字符(rune)和对应的索引,无论是单字节的ASCII字符还是多字节的汉字,都会被正确地解析并返回。上述程序的运行结果如下:

在这里插入图片描述

说明一下:

  • 在for range循环中遍历字符串时,每次迭代会返回两个值,第一个是字符的索引,第二个是字符的值,当遍历结束后会自动退出for循环。

跳转控制

break语句

break语句

Go中break语句可以用于跳出for循环语句或switch语句。如下:

package main

import "fmt"

func main() {
	// break语句
	for i := 0; i < 10; i++ {
		if i == 6 {
			break
		}
		fmt.Printf("%d ", i)
	}
	fmt.Println()
}

在多层循环嵌套语句中,break默认只会跳出最近的for循环,如果希望跳出更外层的for循环,可以通过标签进行指明。如下:

package main

import "fmt"

func main() {
	// break标签
label:
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			for k := 0; k < 10; k++ {
				if i == 2 && j == 3 && k == 4 {
					break label
				}
				fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k)
			}
		}
	}
}

说明一下:

  • 当使用break语句指定标签时,该标签必须用于标记循环语句或switch语句的起始位置。
  • 标签的命名应该符合标识符命名规则,标签名由用户自定义。

continue语句

continue语句

Go中continue语句用于for循环中,可以停止当前的迭代并进入下一次迭代。如下:

package main

import "fmt"

func main() {
	// continue语句
	for i := 0; i < 10; i++ {
		if i == 6 {
			continue
		}
		fmt.Printf("%d ", i)
	}
	fmt.Println()
}

在多层循环嵌套语句中,continue默认只会作用到最近的for循环,如果希望作用到更外层的for循环,可以通过标签进行指明。如下:

package main

import "fmt"

func main() {
	// continue标签
label:
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			for k := 0; k < 10; k++ {
				if i == 2 && j == 3 && k == 4 {
					continue label
				}
				fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k)
			}
		}
	}
}

说明一下:

  • 当使用continue语句指定标签时,该标签必须用于标记循环语句的起始位置。

goto语句

goto语句

Go中的goto语句用于无条件地跳转到程序中指定标签的位置。如下:

package main

import "fmt"

func main() {
	// goto语句
	for i := 0; i < 10; i++ {
		for j := 0; j < 10; j++ {
			for k := 0; k < 10; k++ {
				if i == 2 && j == 3 && k == 4 {
					goto label
				}
				fmt.Printf("i = %d, j = %d, k = %d\n", i, j, k)
			}
		}
	}
label:
	fmt.Println("other code...")
}

说明一下:

  • goto语句通常与条件语句配合使用,用于实现条件转移,跳出循环体等功能。
  • Go程序中一般不主张使用goto语句,以免造成程序流程混乱。

return语句

return语句

Go中的return语句在方法或函数中使用,表示跳出所在的方法或函数。如下:

package main

import "fmt"

func main() {
	// return语句
	for i := 0; i < 10; i++ {
		if i == 6 {
			return
		}
		fmt.Printf("%d ", i)
	}
}

说明一下:

  • 在普通函数中使用return语句,表示跳出当前函数,可以理解成终止函数。
  • 在main函数中使用return语句,表示终止main函数,即终止整个程序。

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

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

相关文章

Linux 学习之路 -- 进程篇 -- 进程控制

目录 一、进程终止 <1>使用语言和系统自带的方法&#xff0c;进行转换 <2>自定义错误码 <3>小结&#xff1a; <2>两个接口exit / _exit 二、进程等待 <1>简单了解 <2>wait调用 <3>waitpid调用 <4>status <1>W…

第十四章大数据和数据科学4分

14.1 引言 14.1.3 科学理念 1.数据科学 数据科学将数据挖掘、统计分析和机器学习与数据集成整合&#xff0c;结合数据建模能力&#xff0c;去构建预测模型、探索数据内容模式。 数据科学依赖于&#xff1a; 1&#xff09;丰富的数据源。具有能够展示隐藏在组织或客户行为中不…

顺序表的应用-通讯录

顺序表的应用-通讯录 1.操作2.功能要求2.1.功能要求2.2.思路小结2.3.文件梳理2.4.代码实现"SeqList.h""Contact.h""SeqList.c""Contact.c""test.c" 1.操作 链接: 顺序表专题 这篇文章介绍了顺序表的概念与基本操作。 本文将…

什么是 GitHub Wiki 以及如何使用它?

GitHub Wiki 是你项目文档的一个很好的地方。你可以使用 wiki 来创建、管理和托管你的存储库的文档&#xff0c;以便其他人可以使用并为你的项目做出贡献。 GitHub Wiki 很容易开始使用&#xff0c;无需安装任何其他软件。最好的部分是 wiki 与你的 GitHub 存储库集成在一起。…

《九》Qt各种对话框之QColorDialog

前言 QColorDialog类继承于QDialog&#xff0c;是一个设计用来选择颜色的对话框部件。 QColorDialog 在介绍 QColorDialog 之前&#xff0c;我们先简单介绍一下 QColor 类。QColor 类用于表示颜色&#xff0c;支持 RGB&#xff08;红绿蓝&#xff09;三原色表示&#xff0c;也…

【C++】日期计算机

个人主页&#xff1a;救赎小恶魔 欢迎大家来到小恶魔频道 好久不见&#xff0c;甚是想念 今天我们要讲述的是一个日期类计算机的代码实现 引言&#xff1a; 我们日常生活中可能会有一个烦恼。 今天几月几号&#xff1f;过n天后又是几月几号&#xff1f;某年某月某天和x年…

PE文件的导入表,动态链接库中的函数应该如何导入

导入地址表IAT IAT保存的内容与windos操作系统的核心进程、内存、DLL结构有关。IAT是一种表格&#xff0c;用来记录程序正在使用哪些库中的哪些函数。 动态链接库(DLL) 常见的kernel.dll就是一个非常重要的动态链接库&#xff0c;其中包含了运行程序时需要使用到的函数&…

文件操作(1)

为什么使⽤⽂件&#xff1f; 如果没有⽂件&#xff0c;我们写的程序的数据是存储在电脑的内存中&#xff0c;如果程序退出&#xff0c;内存回收&#xff0c;数据就丢失了&#xff0c;等再次运⾏程序&#xff0c;是看不到上次程序的数据的&#xff0c;如果要将数据进⾏持久化的…

再谈C语言——理解指针(四)

assert断⾔ assert.h 头⽂件定义了宏 assert() &#xff0c;⽤于在运⾏时确保程序符合指定条件&#xff0c;如果不符合&#xff0c;就报错终⽌运⾏。这个宏常常被称为“断⾔”。 assert(p ! NULL); 上⾯代码在程序运⾏到这⼀⾏语句时&#xff0c;验证变量 p 是否等于 NULL 。…

JavaScript 数学对象 Math

Math对象其实就是数学对象&#xff0c;它给我们提供了各种各样的数学功能。 <!DOCTYPE html> <html> <head><meta charset"UTF-8"><title>首页</title> </head><body><script type"text/javascript"&g…

linux的“>”和“>>”

在Linux中&#xff0c;>和>>都是用于文件重定向的操作符&#xff0c;它们用于将命令的输出发送到文件中。 > 用于创建一个新文件或覆盖现有文件的内容。当你执行一个如 command > file.txt 的命令时&#xff0c;如果 file.txt 文件存在&#xff0c;它的内容将被…

【uniapp】引入uni-ui组件库

&#xff08;1&#xff09;新建项目的时候选择 uni-ui项目 &#xff08;2&#xff09;已经创建好的项目去官网单独安装 跳转单独安装组件 https://uniapp.dcloud.net.cn/component/uniui/quickstart.html#%E9%80%9A%E8%BF%87-uni-modules-%E5%8D%95%E7%8B%AC%E5%AE%89%E8%A3%8…

YOLOv9训练损失、精度、mAP绘图功能 | 支持多结果对比,多结果绘在一个图片(消融实验、科研必备)

一、本文介绍 本文给大家带来的是YOLOv9系列的绘图功能&#xff0c;我将向大家介绍YOLO系列的绘图功能。我们在进行实验时&#xff0c;经常需要比较多个结果&#xff0c;针对这一问题&#xff0c;我写了点代码来解决这个问题&#xff0c;它可以根据训练结果绘制损失(loss)和mA…

VBA技术资料MF144:将PDF首页作为对象插入工作表

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

【C++】如何用C++写一个日期计算器

目录 前言 代码的布局 设计数据 方法声明 方法的实现 获取某年某月的天数 *全缺省的构造函数 * 拷贝构造函数 *赋值运算符重载 *析构函数 日期天数 日期天数 日期-天数 日期-天数 前置 后置 后置-- 前置-- 实现比较大小运算符重载思路 >运算符重载 运算…

盲人餐厅点餐:科技之光照亮餐桌上的美食之旅

在现代社会&#xff0c;餐厅不仅是满足口腹之欲的场所&#xff0c;更是一个社交、放松的重要空间。然而&#xff0c;对于视障人士而言&#xff0c;盲人餐厅点餐这一日常行为&#xff0c;却往往伴随着诸多不便与挑战。幸运的是&#xff0c;科技的革新正为这一群体带来前所未有的…

递归神经网络(RNN)在AI去衣技术中的深度应用

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;图像处理和计算机视觉领域不断取得新的突破。其中&#xff0c;AI去衣技术作为一个具有挑战性的研究方向&#xff0c;引起了广大研究者和公众的关注。递归神经网络&#xff08;RNN&#xff09;作为深度学习的…

【linux】编译器使用

目录 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&#xff09; 2. .o 文件和库的链接方式 a. 链接方式 b. 动态库 和 静态库 优缺点对比 c. debug 版本 和 release 版本 1. gcc &#xff0c;g 编译器使用 a. 有关gcc的指令&#xff08;g同理&…

【第19章】spring-i8n

文章目录 前言一、准备二、Java国际化1.测试类2.测试结果 三、Spring国际化1.配置文件2.测试类3.测试结果4.占位符4.1 准备4.2 测试类4.3 测试结果 总结 前言 在Spring中实现国际化Internationalization&#xff08;i18n&#xff09;其实就是完成语言的切换&#xff0c;类似于…

4.SpringCloud基础项目搭建利用RestTemplate实现远程调用

简单的微服务架构 父pom.xml <?xml version"1.0" encoding"UTF-8"?><project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apa…