当前位置: 首页 > news >正文

【启程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的世界&#xff01;在当今快节奏的软件开发领域&#xff0c;选择一种高效、简洁的编程语言至关重要。而在这方面&#xff0c;Golang&#xff08;又称Go&#xff09;无疑是一个备受瞩目的选择。在本文中&#xff0c;带领您探索Golang的世界&#xff0c;一步步地了…...

Docker: exec命令浅析

简介 Docker exec命令是Docker提供的一个强大工具&#xff0c;用于在正在运行的容器中执行命令。在此将介绍Docker exec命令的用法和示例&#xff0c;帮助大家更好地理解和使用这个命令。 Docker是一种流行的容器化平台&#xff0c;允许用户在容器中运行应用程序。有时候&#…...

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内购的消耗性项目和非续期订阅项目,前后端代码加逻辑分析

前言&#xff1a;公司的项目app在上架苹果商店时发现人家要求里面的部分购买项目必须使用iap购买的方式&#xff0c;使用原本的微信支付方式审核不给通过&#xff0c;无奈只能重新研究这个东西。做起来还是有点麻烦&#xff0c;主要是网上的文章很少&#xff0c;不能直接硬抄。…...

【代码随想录】【算法训练营】【第11天】 [20]有效的括号 [1047]删除字符串中的所有相邻重复项 [150]逆波兰表达式求值

前言 思路及算法思维&#xff0c;指路 代码随想录。 题目来自 LeetCode。 day 11&#xff0c;周六&#xff0c;又开始变的困难了~ 题目详情 [20] 有效的括号 题目描述 20 有效的括号 解题思路 前提&#xff1a;括号匹配 思路&#xff1a;利用栈的后入先出特性&#xf…...

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题对称二叉树

题目&#xff1a; 题解&#xff1a; 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

学习内容&#xff1a; 主要了解了Qt的信号和槽、ui页面布局、各类常见控件的使用、绘图事件以及文件操作的相关知识&#xff0c;并且完成相关案例的设计。练习代码了解了多层感知机、激活函数、多项式回归、高维线性回归、暂退法、分布偏移、深度学习计算等相关知识与代码案例…...

RDP方式连接服务器上传文件方法

随笔 目录 1. RDP 连接服务器 2. 为避免rdp 访问界面文字不清晰 3. 本地上传文件到服务器 1. RDP 连接服务器 # mstsc 连接服务器step1: 输入mstscstep2: 输入 IP, username, passwd 2. 为避免rdp 访问界面文字不清晰 解决方法&#xff1a; 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直接或间接使用的环境变量。 其中大部分也可以在本手册的其他地方找到。 命令行上的选项优先于选项文件和环境变量中指定的值&#xff0c;选项文件中的值优先于环境变量中的值。 在许多情况下&#xff0c;最好使用配置文件而不是环境变量来修改MySQL的行为。…...

Day42 最后一块石头的重量Ⅱ + 目标和 + 一和零

1049 最后一块石头的重量Ⅱ 题目链接&#xff1a;1049.最后一块石头的重量Ⅱ 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和…...

01.爬虫---初识网络爬虫

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

集合、Collection接口特点和常用方法

1、集合介绍 对于保存多个数据使用的是数组&#xff0c;那么数组有不足的地方。比如&#xff0c; 长度开始时必须指定&#xff0c;而且一旦制定&#xff0c;不能更改。 保存的必须为同一类型的元素。 使用数组进行增加/删除元素的示意代码&#xff0c;也就是比较麻烦。 为…...

12. Web开发:介绍Web开发的基本概念,Servlet和JSP的使用,MVC设计模式的应用等。

Web开发的轻松入门之旅 想象一下&#xff0c;Web开发就像是搭建一个在线的小家&#xff0c;你既是设计师&#xff0c;又是建筑师&#xff0c;还是管家。我们一步步来探索这个过程&#xff0c;保证简单易懂&#xff0c;就像搭积木一样有趣&#xff01; Web开发基础认知 Web开…...

文件系统--inode

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

数据清洗(ETL)案例实操

文章目录 数据清洗&#xff08;ETL&#xff09;概述案例需求和分析代码实现和结果分析 数据清洗&#xff08;ETL&#xff09;概述 “ETL&#xff0c;是英文Extract-Transform-Load的缩写&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&…...

Zookeeper 面试题(一)

1. ZooKeeper 适合哪些应用场景&#xff1f; ZooKeeper 是一个高性能、高可靠的分布式协调系统&#xff0c;它在分布式系统和大数据领域中有着广泛的应用。以下是 ZooKeeper 适合的一些应用场景&#xff1a; 数据发布/订阅&#xff1a;ZooKeeper 可以作为配置中心&#xff0c;…...

怎么安装django特定版本

要安装Django的特定版本&#xff0c;你可以使用Python的包管理工具pip。以下是在命令行中安装Django特定版本的步骤&#xff1a; 确保你的计算机上已经安装了Python和pip。如果没有安装&#xff0c;你可以从Python官方网站下载并安装最新版本的Python&#xff0c;pip通常会随Py…...

关于Broken pipe异常的一点学习记录

什么是Broken pipe? pipe&#xff0c;管道&#xff0c;管道里面自然就是数据&#xff0c;通过指从文件或网络套接字读取的数据。当一个进程试图向一个已关闭的管道&#xff08;pipe&#xff09;写数据或者从一个已关闭的通道读数据时就会出现中断&#xff0c;也就是Broken pi…...

第十一课,end关键字、简单while循环嵌套、初识for循环

一&#xff0c;end关键字 end关键字用于在print输出的内容后面声明结束的字符&#xff0c;我们之前学过并且十分了解print是默认输出内容之后跟着换行的&#xff0c;如果我们不希望换行而希望使用其它字符来代替换行&#xff0c;就可以用end关键字来实现 特殊的&#xff0c;en…...

spring boot 集成mongodb

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId><version>2.2.0.RELEASE</version></dependency>配置db: spring:data:mongodb:host: 127.0.…...

从零开始搭建SpringCloud Alibaba微服务架构

Spring Cloud Alibaba是Spring Cloud的一个拓展项目&#xff0c;它用于构建基于阿里巴巴的微服务应用。它提供了多个阿里巴巴的开源组件&#xff0c;如Nacos、Sentinel、Dubbo等&#xff0c;用于解决微服务架构中的服务注册、配置管理、流量控制等问题。 Spring Cloud Alibaba…...

SpringBoot(八)之JdbcTemplate

SpringBoot&#xff08;八&#xff09;之JdbcTemplate 文章目录 SpringBoot&#xff08;八&#xff09;之JdbcTemplate1.添加依赖项&#xff1a;2. 配置数据库连接3.创建表信息4. 创建数据模型5. 创建 Repository6.测试,创建TestController spring-boot-starter-jdbc 是 Spring…...

ClickHouse 24.4 版本发布说明

本文字数&#xff1a;13148&#xff1b;估计阅读时间&#xff1a;33 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 新的一个月意味着新版本的发布&#xff01; 发布概要 本次ClickHouse 24.4版本包含了13个新功能&#x1f381;…...

amtlib.dll打不开怎么办?一键修复丢失amtlib.dll方法

电脑丢失amtlib.dll文件是什么情况&#xff1f;出现amtlib.dll打不开怎么办&#xff1f;这样的情况有什么解决方法呢&#xff1f;今天就和大家聊聊amtlib.dll文件同时教大家一键修复丢失amtlib.dll方法&#xff1f;一起来看看amtlib.dll文件丢失会有哪些方法修复&#xff1f; a…...

【退役之重学Java】关于 volatile 关键字

一、是什么 volatile 是Java中的关键字&#xff0c;用于声明变量&#xff0c;具有两个主要特性使其特殊。 二、两个特性 首先&#xff0c;如果有一个volatile变量&#xff0c;任何线程都无法将其缓存在计算机的缓存中。访问始终从主内存中进行。其次&#xff0c;如果volatile变…...

“大数据建模、分析、挖掘技术应用研修班”的通知!

随着2015年9月国务院发布了《关于印发促进大数据发展行动纲要的通知》&#xff0c;各类型数据呈现出了指数级增长&#xff0c;数据成了每个组织的命脉。今天所产生的数据比过去几年所产生的数据大好几个数量级&#xff0c;企业有了能够轻松访问和分析数据以提高性能的新机会&am…...

Uniapp自定义默认返回按钮回退页面

//自定义后退时的操作onBackPress() {this.back1();return true;}, methods: { //跳转到 tabBar 页面&#xff0c;并关闭其他所有非 tabBar 页面back1() {uni.switchTab({url: /pages/mangement/mangement});},//关闭所有页面&#xff0c;打开到应用内的某个页面。back1() {uni…...