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

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

目录

运算符

算术运算符

赋值运算符

关系运算符

逻辑运算符

位运算符

其他运算符

流程控制

条件语句

循环语句

跳转语句


运算符

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

算术运算符

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

举例的代码如下:

package main
import "fmt"
func main() {// + 加号的三个作用// 1. 用于表示正数var n1 int = +10fmt.Println(n1)// 2. 相加操作var n2 int = 10 + 12fmt.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 = 10n3++fmt.Println(n3)
}

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

赋值运算符

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

举例的代码如下:

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

关系运算符

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

举例的代码如下:

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

逻辑运算符

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

举例的代码如下:

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

位运算符

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

举例的代码如下:

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

其他运算符

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

举例的代码如下:

package main
import "fmt"
func main() {// 定义一个变量var a int = 10fmt.Println("a对应的存储空间地址为:", &a) //  0xc000116068var ptr *int = &afmt.Println(ptr) //  0xc000116068fmt.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 intvar grade stringprintln("请输入成绩:")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-100var sum int = 0// 注意:for循环初识表达式,不能用var定义变量的形式,要用 :=for i := 1; i <= 100; i++ {sum += i}println(sum) // 5050
}

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

func main() {// 死循环实现方式1for {println("死循环")}// 死循环实现方式2for ;; {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 = 0for i := 1; i <= 100; i++ {sum += ifmt.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.mzph.cn/news/843582.shtml

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

相关文章

如何让UE4.26使用VS2022【Windows,源码下载】

使用UE5一直用的是VS2022&#xff0c;都是因为团队需要&#xff0c;只能用UE4&#xff0c;而我电脑中拥有的UE4的版本是UE4.26以及VS2022&#xff0c;我不可能去下载VS2019来为这么一个项目&#xff0c;所以就研究了一下是哪里阻止了UE4.26不让我使用VS2022. 首先下载UE4.26源码…

记一次安卓“Low on memory“崩溃问题

前言 最近再调人脸识别算法相关demo,发现调试期间总是偶发性崩溃&#xff0c;捕获不到异常的那种&#xff0c;看日志发现原因是Low on memory&#xff0c;一开始还疑惑 App内存不够应该是OOM啊,怎么会出现这种问题&#xff0c;百思不得其解&#xff0c;直到我打开了 Android s…

在MySQL数据库中进行连接查询中的外连接查询

左外连接 特征&#xff1a;以左表为主&#xff0c;显示左表所有数据&#xff0c;相关联存在相同的值时显示对应数据&#xff0c;否则显示为NULL 语法&#xff1a;> select 表名.字段名称&#xff0c;表名.字段名称 from 表名 left join 表名 on 相关联的字段…

Linux java jni调用C++封装动态库

由于项目中java需要调用第三方提供的C动态库&#xff1b;由于第三方动态库传入的参数较多&#xff0c;还伴随着指针传入操作&#xff0c;导致java调用极为不便&#xff01;因此催生出对于第三方的C动态库进行二次封装。java调用只需按结构传入一个结构化的string即可。话不多说…

卧槽!这项目开源了!【送源码 】

随着科技的飞速发展&#xff0c;个人财务管理变得越来越重要。一个名为‘Maybe’的创新型个人财务与财富管理应用程序随之诞生&#xff0c;它以其丰富的功能和用户友好的界面受到了广大用户的关注。 现在项目方将这个价值 100万美元的个人理财应用项目开源了 Maybe Maybe应用…

吴恩达2022机器学习专项课程C2W2:2.19 sigmoid函数的替代方案 2.20如何选择激活函数 2.21 激活函数的重要性

这里写目录标题 引言sigmoid激活函数的局限1.回顾需求案例2.ReLU激活函数 常用的激活函数1.线性激活函数的解释 如何选择激活函数&#xff1f;1.选择输出层的激活函数2.选择隐藏层的激活函数 选择激活函数的总结1.输出层总结2.隐藏层总结3.TensorFlow设置激活函数 激活函数多样…

AI生成视频解决方案,降低成本,提高效率

传统的视频制作方式往往受限于高昂的成本、复杂的拍摄流程以及硬件设备的限制&#xff0c;为了解决这些问题&#xff0c;美摄科技凭借领先的AI技术&#xff0c;推出了全新的AI生成视频解决方案&#xff0c;为企业带来前所未有的视觉创新体验。 一、超越想象的AI视频生成 美摄…

大模型时代的具身智能系列专题(四)

google deepmind团队 谷歌旗下最大的两个 AI 研究机构——地处伦敦 DeepMind 与位于硅谷的 Google Brain 合并成立新部门 Google DeepMind。其将机器学习和系统神经科学的最先进技术结合起来&#xff0c;建立强大的通用学习算法。代表作有AlphaGo&#xff0c;AlphaStar&#x…

鸿蒙ArkTS声明式开发:跨平台支持列表【组件快捷键事件】

组件快捷键事件 开发者可以设置组件的自定义组合键&#xff0c;组合键的行为与click行为一致&#xff0c;组件在未获得焦点状态下也可以响应自定义组合键&#xff0c;每个组件可以设置多个组合键。 说明&#xff1a; 开发前请熟悉鸿蒙开发指导文档&#xff1a; gitee.com/li-s…

香橙派 AiPro通过Micro USB接口进行串口调试

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、配置步骤1.安装CH343驱动2.配置串口参数 二、使用步骤总结 前言 最近在玩一个新玩具香橙派 AiPro&#xff0c;除了通过SSH方式连接开发板以外&#xff0c;…

华为机考入门python3--(32)牛客32-密码截取

分类&#xff1a;最长对称子串、动态规划 知识点&#xff1a; 生成二维数组 dp [[0] * n for _ in range(n)] 求最大值 max(value1, value2) 动态规划的步骤 a. 定义问题 长度为n下最长的对称子串的长度 b. 确定状态 dp[i][j]表示字符串从索引i到j的子串是否为对称…

封装,static,代码块,对象的打印

封装&#xff0c;static&#xff0c;代码块&#xff0c;对象的打印 1. 封装1.1 封装的概念1.2 包的概念1.3 访问修饰限定符1.4 被封装的属性如何set和get&#xff1f; 2. static2.1 再谈学生类2.2 static修饰成员变量2.3 static修饰成员方法2.4 static成员变量初始化 3. 代码块…

IGMP——组播成员端网络协议

目录 一.IGMP基本概念 &#xff08;1&#xff09;组播转发困境 &#xff08;2&#xff09;感知组播成员方式 &#xff08;3&#xff09;IGMP版本 二.IGMP各版本的区别与联系 &#xff08;1&#xff09;IGMPV1 1.普遍组查询报文 2.成员关系报告报文 3.IGMPV1报文格式 4…

java第十七课 —— 递归

方法递归调用 递归就是方法自己调用自己&#xff0c;每次调用时传入不同的变量&#xff0c;递归有助于编程者解决复杂问题&#xff0c;同时可以让代码变得简洁。 递归重要规则 执行一个方法时&#xff0c;就创建一个新的受保护的独立空间&#xff08;栈空间&#xff09;。方…

922. 按奇偶排序数组 II - 力扣

1. 题目 给定一个非负整数数组 nums&#xff0c; nums 中一半整数是 奇数 &#xff0c;一半整数是 偶数 。 对数组进行排序&#xff0c;以便当 nums[i] 为奇数时&#xff0c;i 也是 奇数 &#xff1b;当 nums[i] 为偶数时&#xff0c; i 也是 偶数 。 你可以返回 任何满足上述…

微服务架构-异步消息传递设计模式

微服务架构-异步消息传递设计模式 异步消息允许服务发送消息后立即返回&#xff0c;而不需要等待消息被处理完毕&#xff0c;这种异步方式可以大大提高系统的处理速度、和吞吐量。 微服务架构&#xff0c;通常涉及多个服务之间的相互调用&#xff0c;如果通信只是在少数几个微…

lama-cleaner中的Paint-by-Example使用

Lama Cleaner是一个免费的、开源的、完全自托管的修复工具&#xff0c;里面提供了很多最前沿的AIGC模型。可以使用它从图片中删除任何不需要的物体、缺陷、人物&#xff0c;或删除和替换图片上的任何内容。本文章详细介绍了该工具的所有功能&#xff0c;并体验了下每个功能的实…

Shell编程之正则表达式与文本处理器

一、正则表达式 之前学习了 Shell 脚本的基础用法&#xff0c;已经可以利用条件判断、循环等语句编辑 Shell 脚本。接下来我们将开始介绍一个很重要的概念——正则表达式&#xff08;RegularExpression&#xff0c;RE&#xff09;。 1.1正则表达式概述 下面先来了解一下正则表…

BUUCTF---web---[BJDCTF2020]ZJCTF,不过如此

1、点开连接&#xff0c;页面出现了提示 传入一个参数text&#xff0c;里面的内容要包括I have a dream。 构造&#xff1a;?/textI have a dream。发现页面没有显示。这里推测可能得使用伪协议 在文件包含那一行&#xff0c;我们看到了next.php的提示&#xff0c;我们尝试读取…

卢文岩博士受邀参与中国科学院大学校友论坛 解码DPU核心价值

近日&#xff0c;第五届中国科学院大学校友创新论坛正式举行&#xff0c;本次论坛聚焦科技前沿领域&#xff0c;旨在搭建高端对话平台&#xff0c;促进产学研深度融合。在大算力时代——AI技术前沿沙龙上&#xff0c;中科驭数高级副总裁、CTO卢文岩博士受邀分享《DPU——连接算…