【启程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,我无法被执行")
}
最终得到的结果如下所示:
相关文章:

【启程Golang之旅】运算符与流程控制讲解
欢迎来到Golang的世界!在当今快节奏的软件开发领域,选择一种高效、简洁的编程语言至关重要。而在这方面,Golang(又称Go)无疑是一个备受瞩目的选择。在本文中,带领您探索Golang的世界,一步步地了…...
Docker: exec命令浅析
简介 Docker exec命令是Docker提供的一个强大工具,用于在正在运行的容器中执行命令。在此将介绍Docker exec命令的用法和示例,帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台,允许用户在容器中运行应用程序。有时候&#…...
c++的查漏补缺 1、函数指针
今天写链表的插入排序时遇到了一个问题 void InsertionSortList(ListNode* head, int n){if (!head||!head->next) return nullptr;auto dummy new ListNode(-1);dummy->next head;auto pre head;auto cur head->next;while (cur ! NULL){auto tmp dummy;if (pre…...

uniapp+php服务端实现苹果iap内购的消耗性项目和非续期订阅项目,前后端代码加逻辑分析
前言:公司的项目app在上架苹果商店时发现人家要求里面的部分购买项目必须使用iap购买的方式,使用原本的微信支付方式审核不给通过,无奈只能重新研究这个东西。做起来还是有点麻烦,主要是网上的文章很少,不能直接硬抄。…...

【代码随想录】【算法训练营】【第11天】 [20]有效的括号 [1047]删除字符串中的所有相邻重复项 [150]逆波兰表达式求值
前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 11,周六,又开始变的困难了~ 题目详情 [20] 有效的括号 题目描述 20 有效的括号 解题思路 前提:括号匹配 思路:利用栈的后入先出特性…...
vue实现图片懒加载
在src中创建一个directives文件夹在里面创建一个lazy.js文件 在main.js中引入 import lazy from ./directives/lazy app.directive(lazy, lazy) 在app.vue中 <script setup lang"ts"> import { RouterLink, RouterView } from vue-router import HelloWorl…...

Python | Leetcode Python题解之第101题对称二叉树
题目: 题解: class Solution:# 在【100. 相同的树】的基础上稍加改动def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:if p is None or q is None:return p is qreturn p.val q.val and self.isSameTree(p.left, q.ri…...
周报5.20~5.26
学习内容: 主要了解了Qt的信号和槽、ui页面布局、各类常见控件的使用、绘图事件以及文件操作的相关知识,并且完成相关案例的设计。练习代码了解了多层感知机、激活函数、多项式回归、高维线性回归、暂退法、分布偏移、深度学习计算等相关知识与代码案例…...

RDP方式连接服务器上传文件方法
随笔 目录 1. RDP 连接服务器 2. 为避免rdp 访问界面文字不清晰 3. 本地上传文件到服务器 1. RDP 连接服务器 # mstsc 连接服务器step1: 输入mstscstep2: 输入 IP, username, passwd 2. 为避免rdp 访问界面文字不清晰 解决方法: 3. 本地上传文件到服务器 step…...

网络信息安全
目录 引言 网络信息安全的基本概念 定义 主要目标 网络信息安全的范围 主要威胁 恶意软件 黑客攻击 拒绝服务攻击 社交工程 内部威胁 常用技术和防护措施 加密技术 防火墙 入侵检测和防御系统 访问控制 多因素认证 安全审计和监控 安全培训和意识提升 未来发…...

java中的对象
文章目录 一、对象的创建过程1.1 检查加载1.2 分配内存1.3 内存空间初始化1.4 设置对象头1.5 对象初始化 二、对象内存布局2.1 布局解析2.2 JOL使用 三、对象的访问定位3.1 句柄访问3.2 直接指针 四、对象的分配策略4.1 栈上分配4.2 优先分配到Eden区4.3 大对象直接进入老年代4…...
【MySQL精通之路】MySQL-环境变量
本节列出了MySQL直接或间接使用的环境变量。 其中大部分也可以在本手册的其他地方找到。 命令行上的选项优先于选项文件和环境变量中指定的值,选项文件中的值优先于环境变量中的值。 在许多情况下,最好使用配置文件而不是环境变量来修改MySQL的行为。…...
Day42 最后一块石头的重量Ⅱ + 目标和 + 一和零
1049 最后一块石头的重量Ⅱ 题目链接:1049.最后一块石头的重量Ⅱ 有一堆石头,用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合,从中选出任意两块石头,然后将它们一起粉碎。假设石头的重量分别为 x 和…...

01.爬虫---初识网络爬虫
01.初识网络爬虫 1.什么是网络爬虫2.网络爬虫的类型3.网络爬虫的工作原理4.网络爬虫的应用场景5.网络爬虫的挑战与应对策略6.爬虫的合法性总结 1.什么是网络爬虫 网络爬虫,亦称网络蜘蛛或网络机器人,是一种能够自动地、系统地浏览和收集互联网上信息的程…...

集合、Collection接口特点和常用方法
1、集合介绍 对于保存多个数据使用的是数组,那么数组有不足的地方。比如, 长度开始时必须指定,而且一旦制定,不能更改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素的示意代码,也就是比较麻烦。 为…...
12. Web开发:介绍Web开发的基本概念,Servlet和JSP的使用,MVC设计模式的应用等。
Web开发的轻松入门之旅 想象一下,Web开发就像是搭建一个在线的小家,你既是设计师,又是建筑师,还是管家。我们一步步来探索这个过程,保证简单易懂,就像搭积木一样有趣! Web开发基础认知 Web开…...

文件系统--inode
文章目录 概述认识磁盘了解磁盘的存储结构对磁盘的存储结构进行逻辑抽象 操作系统对磁盘的使用宏观认识细节认识再谈目录再谈文件的增删 概述 文件有很多,但是被打开的文件很少,这些没有被打开的文件在磁盘中,这就叫做磁盘文件。每次先打开一…...

数据清洗(ETL)案例实操
文章目录 数据清洗(ETL)概述案例需求和分析代码实现和结果分析 数据清洗(ETL)概述 “ETL,是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(Extract)、转换&…...
Zookeeper 面试题(一)
1. ZooKeeper 适合哪些应用场景? ZooKeeper 是一个高性能、高可靠的分布式协调系统,它在分布式系统和大数据领域中有着广泛的应用。以下是 ZooKeeper 适合的一些应用场景: 数据发布/订阅:ZooKeeper 可以作为配置中心,…...
怎么安装django特定版本
要安装Django的特定版本,你可以使用Python的包管理工具pip。以下是在命令行中安装Django特定版本的步骤: 确保你的计算机上已经安装了Python和pip。如果没有安装,你可以从Python官方网站下载并安装最新版本的Python,pip通常会随Py…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
基于服务器使用 apt 安装、配置 Nginx
🧾 一、查看可安装的 Nginx 版本 首先,你可以运行以下命令查看可用版本: apt-cache madison nginx-core输出示例: nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...