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

news2024/11/15 20:10:38

欢迎来到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,我无法被执行")
}

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

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

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

相关文章

【qt】标准型模型 下

标准型模型 一.前言二.预览数据1.获取表头2.获取数据项 三.保存文件1.文件对话框获取保存文件名2.用文件名初始化文件对象3.打开文件对象4.用文件对象初始化文本流5.写入数据 四.格式1.居右2.居中3.居左4.粗体 五.模型的信号1.解决粗体action问题2.状态栏显示信息 六.总结 一.前…

【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理,以及遇到的困难和总结

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Spring Boot】深度复盘在开发搜索引擎项目中重难点的整理&#xff0c;以及遇到的困难和总结 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 什么是搜索引…

NTFS文件系统文件寻址实操记录

前言 最近在学NTFS&#xff0c;发现网上的博客千篇一律&#xff0c;讲的不够通透&#xff0c;于是决定自己写一篇。 本文章通过寻找文件地址这个任务&#xff0c;讲述了NTFS文件系统$Boot文件、$MFT文件的结构&#xff0c;对$MFT文件中的A0、80属性进行了重点分析。 本文对于…

k8s-pod详解

一、Pod基本概念&#xff1a; 1.pod介绍&#xff1a; Pod是kubernetes中最小的资源管理组件&#xff0c;Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&am…

vs2013使用qt Linguist以及tr不生效问题

一、qt Linguist&#xff08;语言家&#xff09;步骤流程 1、创建翻译文件,在qt选项中 2.选择对应所需的语言&#xff0c;得到.ts后缀的翻译文件 3.创建.pro文件&#xff0c;并将.ts配置在.pro文件中 3.使用qt Linguist 打开创建好的以.ts为后缀的翻译文件&#xff0c;按图所示…

python中的条件语句

python中语句的执行顺序 默认情况下&#xff0c;python代码的执行顺序&#xff0c;是从上到下依次执行的&#xff0c;这个顺序是不会变的&#xff0c; python中的条件语句 电脑的CPU芯片是能够进行算术运算也能进行逻辑判断的。 条件语句能够表达“如果...否则...” 这样的语…

P451 try-Catch异常处理

//基本使用演示代码 public static void main(String[] args) { int num1 10; int num2 0; try { int res num1 / num2; }catch (Exception e) { System.out.println(e.getMessage()); } } public class TryCatchDetail { public static void main(String[] args) { //1. 如…

dubbo复习:(8)使用sentinel对服务进行降级

一、下载sentinel-dashboard控制台应用并在8080端口启动 二、项目添加springboot 和dubbo相关依赖&#xff08;降级规则并未持久化&#xff0c;如果需要持久化&#xff0c;如果需要持久化降级规则&#xff0c;只需增加nacos相关依赖并在nacos中进行配置&#xff0c;然后配置app…

pyside6下没有designer.exe、pyside6-uic.exe等

使用conda安装的pyside6&#xff08;conda install pyside6&#xff09;&#xff0c;发现pyside6目录下没有designer.exe、pyside6-uic.exe等&#xff1b;designer.exe在Miniconda3/Library/bin下 pyside6-uic.exe、pyside6-rcc.exe在Miniconda3\Scripts下 但是 使用pip安装…

前端nvm、nodejs、npm、cnpm、yarn安装教程(超详细图文,含卸载旧的nodejs,安装及环境变量配置)

最近换了新电脑&#xff0c;一开始在网上找了一个教程让下载nvm-noinstall.zip 压缩包解压使用&#xff0c;踩坑了&#xff0c;过程复杂最后报错无法用。 后来搜到下文教程&#xff0c;直接使用nvm。exe进行安装&#xff0c;方便快捷。下面这个文章写的很详细&#xff0c;从如何…

Spark搭建 Standalone模式详细步骤

Standalone模式概述&#xff1a; Standalone模式是Spark自带的一种集群模式&#xff08;本地集群&#xff0c;不依赖与外部集群&#xff0c;比如Yarn&#xff09;&#xff0c;可以真实地在多个机器之间搭建Spark集群的环境。 Standalone是完整的Spark运行环境,其中: Master角…

失业潮中如何突围?优秀PPT案例助你职场逆袭

在这个变幻莫测的时代&#xff0c;失业潮像一场突如其来的暴风雨&#xff0c;许多人在职场的大海中迷失方向。但别担心&#xff0c;即使风浪再大&#xff0c;总有勇敢的航海者能够乘风破浪&#xff0c;找到属于自己的那片新大陆。 今天&#xff0c;我们就来聊聊&#xff0c;在…

leecode 1206|跳表的设计

跳表 跳表&#xff0c;一种链表数据结构&#xff0c;其增删改茶的效率能和平衡树相媲美 leecode1206 可以看上面的那个动画&#xff0c;动画效果很贴切。 我简单讲讲它的机制吧&#xff0c;每个节点不单单是一个&#xff0c;测试好几层&#xff0c;然后同一层的节点和统一节点…

软件杯 深度学习验证码识别 - 机器视觉 python opencv

文章目录 0 前言1 项目简介2 验证码识别步骤2.1 灰度处理&二值化2.2 去除边框2.3 图像降噪2.4 字符切割2.5 识别 3 基于tensorflow的验证码识别3.1 数据集3.2 基于tf的神经网络训练代码 4 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x…

Hadoop3:客户端向HDFS写数据流的流程讲解(较枯燥)

一、场景描述 我们登陆HDFS的web端&#xff0c;上传一个大文件。 二、流程图 三、讲解 流程1&#xff08;Client与NameNode交互&#xff09; 1、HDFS client创建DistributedFileSystem&#xff0c;通过dfs与NameNode进行2次&#xff08;一来一回4次&#xff09;对话&#x…

MySQL多表关联查询习题

一、素材 -- Active: 1714203732007127.0.0.13306db_stu -- 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); -- 创建…

langchain实战-从0到1搭建ai聊天机器人

介绍 当前&#xff0c;人工智能大模型公司如雨后春笋般迅速涌现&#xff0c;例如 OpenAI、文心一言、通义千问等&#xff0c;它们提供了成熟的 API 调用服务。然而&#xff0c;随之而来的是不同公司的繁琐协议接入过程&#xff0c;这让许多开发者感到头疼不已。有没有一种统一…

Redis常见数据类型(6)-set, zset

目录 Set 命令小结 内部编码 使用场景 用户画像 其它 Zset有序集合 普通指令 zadd zcard zcount zrange zrevrange ​编辑 zrangebyscore zpopmax/zpopmin bzpopmax/bzpopmin zrank/zrevrank zscore zrem zremrangebyrank zremrangebyscore Set 命令小结 …

COD论文笔记 Boundary-Guided Camouflaged Object Detection

动机 挑战性任务&#xff1a;伪装物体检测&#xff08;COD&#xff09;是一个重要且具有挑战性的任务&#xff0c;因为伪装物体往往与背景高度相似&#xff0c;使得准确识别和分割非常困难。现有方法的不足&#xff1a;现有的深度学习方法难以有效识别伪装物体的结构和细节&am…

【Rust日报】ratatui版本更新

[new ver] ratatui v0.26.3 一个构建终端用户界面的库。新版本包括&#xff1a; 修复Unicode 截断 bug对颜色更好地序列化更快的渲染弃用assert_buffer_eq宏暴露错误类型常量函数和类型 官网: https://ratatui.rs/ 链接: https://ratatui.rs/highlights/v0263/ [new lib] ansi2…