【启程Golang之旅】运算符与流程控制讲解

欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了解这门语言的基础知识和实用技巧。

目录

运算符

算术运算符

赋值运算符

关系运算符

逻辑运算符

位运算符

其他运算符

流程控制

条件语句

循环语句

跳转语句


运算符

运算符用于对操作数执行算术、逻辑、位或其他运算。Go语言中的运算符包括如下几种情况:

算术运算符

算术运算符包括:如 +(加法)、-(减法)、*(乘法)、/(除法)、%(取模)等。

举例的代码如下:

package main
import "fmt"
func main() {
	// + 加号的三个作用
	// 1. 用于表示正数
	var n1 int = +10
	fmt.Println(n1)
	// 2. 相加操作
	var n2 int = 10 + 12
	fmt.Println(n2)
	// 3. 字符串拼接
	var s1 string = "hello" + "world"
	fmt.Println(s1)

	// / 除号
	fmt.Println(10 / 3)   // 两个整数相除,结果也是整数
	fmt.Println(10.0 / 3) // 浮点数相除,结果也是浮点数

	// % 取余
	fmt.Println(10 % 3)  // 两个整数相除,结果也是整数
	fmt.Println(-10 % 3) // 浮点数相除,结果也是浮点数
	
	// ++ 自增操作 (go语言中,++或者-- 只能放在变量后面,不能放在变量前面,只能单独使用,不能放在表达式中)
	var n3 int = 10
	n3++
	fmt.Println(n3)
}

最终达到的效果如下所示:

赋值运算符

赋值运算符包括:如 =(赋值)、+=(加法赋值)、-=(减法赋值)等。

举例的代码如下:

package main
import "fmt"
func main() {
	var a int = 10
	var b int = 20
	fmt.Printf("a = %v, b = %v\n", a, b) // a = 10, b = 20
	// 交互数值
	var c int
	c = a
	a = b
	b = c
	fmt.Printf("a = %v, b = %v\n", a, b) // a = 20, b = 10
}

关系运算符

关系运算符包括:如 ==(等于)、!=(不等于)、<(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)等。

举例的代码如下:

package main
import "fmt"
func main() {
	// 判断左右两边是否相等,相等返回true,否则返回false
	fmt.Println(5 == 9) // false
	fmt.Println(5 == 5) // true
	fmt.Println(5 > 6)  // false
	fmt.Println(5 < 6)  // true
}

逻辑运算符

逻辑运算符包括:如 &&(逻辑与)、||(逻辑或)、!(逻辑非)等。

举例的代码如下:

package main
import "fmt"
func main() {
	// 与逻辑:&& 两个数值都为真时才为真,否则为假
	fmt.Println(true && true)  // true
	fmt.Println(true && false) // false
	// 或逻辑:|| 两个数值有一个为真时,则结果为真
	fmt.Println(true || true)   // true
	fmt.Println(true || false)  // true
	fmt.Println(false || false) // false
	// 非逻辑:! 逻辑非,取反
	fmt.Println(!true)  // false
	fmt.Println(!false) // true
}

位运算符

位运算符包括:如 &(按位与)、|(按位或)、^(按位异或)、&^(按位清零)、<<(左移)、>>(右移)等。

举例的代码如下:

package main
import "fmt"
func main() {
	var num1 uint8 = 5 // 二进制表示: 0000 0101
	var num2 uint8 = 3 // 二进制表示: 0000 0011

	//比较两个数的每一位,并将至少有一个数为1的位设置为1。
	/*
		num1: 0000 0101 (十进制中的5)
		num2: 0000 0011 (十进制中的3)
		------------
		result: 0000 0111 (十进制中的7)
	*/
	result := num1 | num2 // 结果为 7,二进制表示: 0000 0111
	fmt.Printf("Result: %d\n", result)
}

其他运算符

其他运算符包括:如 &(取地址)、*(解引用指针)、++(自增)、--(自减)等。

举例的代码如下:

package main
import "fmt"
func main() {
	// 定义一个变量
	var a int = 10
	fmt.Println("a对应的存储空间地址为:", &a) //  0xc000116068

	var ptr *int = &a
	fmt.Println(ptr) //  0xc000116068
	fmt.Println("ptr这个指针指向的具体数值为:", *ptr) // 10

}

Go语言有几十种运算符,被分成十几个级别,有的运算符优先级不同,有的运算符优先级相同,请看下表,为了提高优先级可以加():

优先级分类运算符结合性
1逗号运算符,从左到右
2赋值运算符=、+=、-=、/=、%=、>=、<<=、&=、^=、|=从右到左
3逻辑或||从左到右
4逻辑与&&从左到右
5按位或|从左到右
6按位异或^从左到右
7按位与&从左到右
8相等/不等==、!=从左到右
9关系运算符<、<=、>、>=从左到右
10位移运算符<<、>>从左到右
11加法/减法+、-从左到右
12乘法/除法/取余*、/、%从左到右
13单目运算符!、*、&、++、--、+、-从右到左
14后缀运算符( )、[ ]、->从左到右

流程控制

流程控制决定了代码的执行顺序。Go语言中的流程控制结构包括如下几种情况:

条件语句

条件语句也叫分支结构,主要分为if分支和switch分支:

if分支有如下情况

if 语句:用于基于条件执行代码块。    

if-else 语句:用于基于条件执行两个代码块之一。    

if-else if-else 语句:用于基于多个条件执行不同的代码块。    

举例的代码如下:

package main
func main() {
	// 实现如果成绩低于60则提示成绩不及格
	var score int = 69
	// 判断变量可以不需要加括号,但是需要加{}
	if score < 70 {
		println("成绩不及格")
	}
	// 在golang中,if后面可以并列的加入变量的定义,这里通过if else实现
	if count := 10; count < 20 {
		println("count小于20")
	} else {
		println("count大于等于20")
	}
	// 对学生的成绩级别进行判别
	if score < 60 {
		println("不及格")
	} else if score < 80 {
		println("及格")
	} else if score < 90 {
		println("良好")
	} else if score <= 100 {
		println("优秀")
	} else {
		println("成绩有误")
	}
}

switch分支有如下情况

switch 语句:类似于其他语言中的 switch-case 结构,但go的 switch 可以使用任何类型作为条件表达式,并且不需要 break 语句来终止每个 case。

举例的代码如下:

package main
import "fmt"
func main() {
	// 输入学生成绩,判断成绩等级
	var score int
	var grade string
	println("请输入成绩:")
	fmt.Scanln(&score)
	// 使用switch语句进行判断
	switch {
	case score < 60:
		grade = "不及格"
	case score >= 60 && score <= 70:
		grade = "及格"
	case score > 70 && score <= 80:
		grade = "良好"
	case score > 80 && score <= 100:
		grade = "优秀"
	default:
		grade = "请输入正常的成绩"
	}
	// 输出成绩等级
	println("成绩等级为:", grade)
}

最终得到的结果如下所示:

注意事项

1)switch后是一个表达式(即:常量值、变量、一个有返回值的函数等都可以)

2)case后面的表达式如果是常量值(字面量),则要求不能重复

3)case后的各个值的数据类型,必须和switch的表达式数据类型一致

4)case后面可以带多个值,使用逗号间隔。比如case值1,值2...

5)case后面不需要带break

6)default语句不是必须的,位置也是随意的。

7)switch后也可以不带表达式,当做if分支来使用

8)switch后也可以直接声明/定义一个变量,分号结束,不推荐

9)switch穿透,利用fallthrough关键字,如果在case语句块后增加fallthrough,则会继续执行下一个case,也叫switch穿透。

循环语句

go语言中循环语句只有for 循环,用于重复执行代码块,直到满足某个条件。

for 循环的初始化,条件和迭代可以在同一行中指定,或在一个大括号{}内的代码块中指定。

举例的代码如下:

func main() {
	// 求和 1-100
	var sum int = 0
	// 注意:for循环初识表达式,不能用var定义变量的形式,要用 :=
	for i := 1; i <= 100; i++ {
		sum += i
	}
	println(sum) // 5050
}

如果想书写死循环的话,可以采用下面的方式进行:

func main() {
	// 死循环实现方式1
	for {
		println("死循环")
	}
	// 死循环实现方式2
	for ;; {
		println("死循环")
	}
}

range 关键字:常与 for 循环一起使用,用于迭代数组、切片、映射或通道的元素。其在语法上类似其他语言中的foreach,一般形式如下:

for key, val := range coll {
    ...
}

举例的代码如下:

func main() {
	var str string = "hello world"
	// 对str进行遍历,i是索引,value是str的每个字符
	for i, value := range str {
		println(i, string(value))
	}
}

最终得到的结果如下所示:

跳转语句

跳转语句是编程中用于改变程序正常执行流程的一种控制语句。它们允许程序在特定条件下跳过某些代码段,或者立即结束某个循环或函数,从而改变程序的执行路径。以下是四种常见的跳转语句及其描述:

break语句:用于立即退出最内层的循环或 switch 语句。用于立即终止离它最近的循环(如while、do-while、for)或switch语句,并从这些语句之后的第一条语句继续执行。

举例的代码如下:

func main() {
	var sum int = 0
	for i := 1; i <= 100; i++ {
		sum += i
		fmt.Println(sum)
		if sum >= 300 {
			break
		}
	}
	fmt.Println(sum, "sum > 300, 程序停止了")
}

最终得到的结果如下所示:

continue语句:用于跳过当前循环的剩余部分,并立即开始下一次迭代。用于终止当前循环的本次迭代,并立即开始下一次迭代。    

举例的代码如下:

func main() {
	// 输出1-100中被6整除的数:
	// 正常使用if语句
	for i := 1; i <= 100; i++ {
		if i%6 == 0 {
			println(i)
		}
	}
	// 采用continue语句
	for i := 1; i <= 100; i++ {
		if i%6 != 0 {
			continue
		}
		println(i)
	}
}

最终得到的结果如下所示:

goto语句:用于无条件地跳转到程序中的指定标签。尽管 goto 在某些情况下可能有用,但过度使用它可能会导致代码难以理解和维护,因此通常建议避免使用。

举例的代码如下:

package main
import "fmt"
func main() {
	i := 0
	// 定义一个标签
	startLoop:
	// 使用for循环和goto模拟一个可能使用goto的场景
	// 在实际编程中,通常不需要使用goto来实现循环
	for {
		if i > 10 {
			// 当i大于10时,跳转到endLoop标签处
			goto endLoop
		}
		fmt.Println(i)
		i++
		// 假设有一些复杂的条件判断,导致我们需要重新开始循环
		// 这里使用goto来模拟这种情况
		goto startLoop
	}

	// 这个endLoop标签在for循环内部是访问不到的,但为了演示goto的用法,我们放在这里
	endLoop:
	fmt.Println("Loop ended")

	// 注意:在实际程序中,endLoop标签后面的代码永远不会被执行到,
	// 因为for循环会无限循环直到i大于10,然后goto跳转到endLoop,
	// 接着main函数就结束了,不会继续执行endLoop后面的代码。
}

最终得到的结果如下所示:

return语句:return语句后面的代码不会被执行,因为函数已经退出。用于立即结束当前函数,并将控制权返回给调用该函数的地方。

举例的代码如下:

package main
import "fmt"
func main() {
	for i := 1; i <= 100; i++ {
		fmt.Println(i)
		if i == 10 {
			return
		}
	}
	fmt.Println("由于return,我无法被执行")
}

最终得到的结果如下所示: 

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

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

相关文章

java -spring 15 配置类 ConfigurationClassPostProcessor

01Spring中定义的配置类 ConfigurationClassPostProcessor是一个BeanFactory的后置处理器&#xff0c;因此它的主要功能是参与BeanFactory的建造&#xff0c;在这个类中&#xff0c;会解析加了Configuration的配置类&#xff0c;还会解析ComponentScan、ComponentScans注解扫描…

【全开源】知识库文档系统源码(ThinkPHP+FastAdmin)

知识库文档系统源码&#xff1a;构建智慧知识库的基石 引言 在当今信息爆炸的时代&#xff0c;知识的有效管理和利用对于企业和个人来说至关重要。知识库文档系统源码正是为了满足这一需求而诞生的&#xff0c;它提供了一个高效、便捷的平台&#xff0c;帮助用户构建、管理、…

全金属狂潮!金银铜齐飞

在纽约铜史诗级逼空的影响下&#xff0c;全球金属市场迎来了一波“全金属狂潮”。 全金属狂潮 本周&#xff0c;纽约、上海交易所铜价纷纷创下新高。周五&#xff0c;伦敦金属交易所的铜价也录得2.8%涨幅&#xff0c;逼近2022年3月的历史最高点。 与此同时&#xff0c;白银价…

Ardupilot开源代码之Rover上路 - 后续3

Ardupilot开源代码之Rover上路 - 后续3 1. 源由2. 深度配置2.1 编码器2.2 WS2812B LED灯带2.3 4GLTE超视距2.3.1 摄像头2.3.2 QGC OSD虚拟遥控2.3.3 QGC外接JoyStick遥控 2.4 伴机电脑供电 3. 实测效果4. 遗留&后续4.1 设置倒车按钮4.2 MP无法连接ESP82664.3 高精度编码器问…

FFMPEG 解码过程初步学习

1. 视频文件解码过程 解码过程 步骤如下&#xff1a; 视频文件&#xff08;封装格式&#xff0c;MP4/FLV/AVI 等&#xff09;获取视频格式信息等解复用为Stream 流&#xff0c; 准备解码用的Codec将Stream 流 使用解码器解为Raw 格式针 1.1 音视频格式填充&#xff1a; int…

神秘山洞惊现AI绘画至宝Stable Diffusion残卷

最近听到不少大宗门纷纷发声&#xff1a;随着AI神器的现世“程序员职业将不复存在”&#xff0c;“设计图将要失业”。 至此&#xff0c;不少修士开始担忧起来&#xff0c;现出世的AI神器会不会取代掉我辈修士。 其实&#xff0c;至女娲天神创造人类以来&#xff0c;在这漫漫…

接口测试流程详解

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在讲接口测试流程之前&#xff0c;首先需要给大家申明下&#xff1a;接口测试对于测试人员而言&a…

STM32H743的FDCAN使用方法(1):STM32CubeMX初始化代码生成

0 工具准备 1.STM32CubeMX1 前言 本文介绍基于STM32CubeMX&#xff0c;使用stm32h743xi的对FDCAN2进行配置的方法。 2 初始化代码生成 2.1 选择FDCAN引脚 本例选择PB5、PB6作为FDCAN2的RX、TX引脚。 2.2 选择FDCAN时钟源 本例选择PLL2Q作为FDCAN时钟源&#xff0c;频率…

深度学习中的优化算法二(Pytorch 19)

一 梯度下降 尽管梯度下降&#xff08;gradient descent&#xff09;很少直接用于深度学习&#xff0c;但了解它是理解下一节 随机梯度下降算法 的关键。例如&#xff0c;由于学习率过大&#xff0c;优化问题可能会发散&#xff0c;这种现象早已在梯度下降中出现。同样地&…

YOLOV10实时端到端目标检测

代码地址&#xff1a;GitHub - THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection 论文地址&#xff1a;https://arxiv.org/pdf/2405.14458 本文介绍了YOLO系列目标检测器在实时和高效方面的优势&#xff0c;但是仍然存在一些缺陷&#xff0c;包括依赖非极大值…

Linux修炼之路之冯系结构,操作系统

目录 一&#xff1a;冯诺依曼体系结构 1.五大组件 2.存储器存在的意义 3.几个问题 二&#xff1a;操作系统 接下来的日子会顺顺利利&#xff0c;万事胜意&#xff0c;生活明朗-----------林辞忧 一&#xff1a;冯诺依曼体系结构 我们当代的计算机的基本构成都是由冯诺依曼…

【Tools】微服务工程中的通用功能模块抽取

Catalog 通用功能模块抽取一、需求二、步骤三、细节 通用功能模块抽取 一、需求 在微服务工程中&#xff0c;可能有一些工具类、实体类是多个微服务通用的&#xff0c;如果在每个微服务中都复制粘贴这些工具类&#xff0c;会产生很多重复性的代码&#xff0c;对开发来说也很繁…

git revert 和 git reset

文章目录 工作区 暂存区 本地仓库 远程仓库需求&#xff1a;已推送到远程仓库&#xff0c;想要撤销操作git revert &#xff08;添加新的提交来“反做”之前的更改&#xff0c;云端会残留上次的提交记录&#xff09;git reset&#xff08;相当于覆盖上次的提交&#xff09;1.--…

Convolutional Occupancy Networks【ECCV】

论文&#xff1a;https://arxiv.org/pdf/2003.04618 代码&#xff1a;GitHub - autonomousvision/convolutional_occupancy_networks: [ECCV20] Convolutional Occupancy Networks 图 1&#xff1a;卷积占据网络。传统的隐式模型 (a) 由于其全连接网络结构&#xff0c;表现能力…

自回归模型(二):具有自回归误差的回归

让我们考虑一个问题&#xff0c;其中我们有一个y变量和多个x变量&#xff0c;它们都被测量为时间序列。举个例子&#xff0c;我们可以将y设定为高速公路上每月的事故数量&#xff0c;而x则表示每月在高速公路上的交通量&#xff0c;观测时间为连续的120个月。一个多元&#xff…

YOLOv10尝鲜测试五分钟极简配置

最近清华大学团队又推出YOLOv10&#xff0c;真是好家伙了。 安装&#xff1a; pip install supervision githttps://github.com/THU-MIG/yolov10.git下载权重&#xff1a;https://github.com/THU-MIG/yolov10/releases/download/v1.0/yolov10n.pt 预测&#xff1a; from ult…

AI爆文写作:或许开放性的标题,才会更让人想点开了解答案

这是新华社公众号的一条推文 从信息传递上来说&#xff0c;新闻标题应该直接&#xff0c;包含关键信息。 但这个标题&#xff0c;却没有直接点名哪个国家&#xff0c;要点进去才能看到。 这就是要让人点开的标题特征&#xff0c;标题没有提供完整信息&#xff0c;是开放性的…

【vue-6】监听

一、监听watch 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

Vue的学习 —— <Echarts组件库技术应用>

目录 前言 正文 一、ECharts技术简介 二、Vue3集成Echarts 1、安装Echarts 2、引入方式 三、Echarts基础篇 1、图表容器及大小 2、样式 2.1 颜色主题 3、坐标轴 5、数据集 5.1 在series中设置数据集 5.2 在dataset中设置数据集 四、常用图表实操 1、柱状图 2、…

关于burp的intruder返回包空白问题

记录一下被自己蠢笑的问题 burp返回包为空怎么办&#xff0c;在查询无果后经过多次试验&#xff0c;确实没有效果 看那三个点还以为加载呢&#xff0c;攻击完了怎么一个显示没有 于是…… 鼠标到三个点&#xff0c;往下一拉 哈哈哈哈哈哈哈&#xff0c;真是被自己给蠢到了