【Go】深入探索Go语言中运算符

news2024/11/24 15:54:48

在这里插入图片描述

✨✨ 欢迎大家来到景天科技苑✨✨

🎈🎈 养成好习惯,先赞后看哦~🎈🎈

🏆 作者简介:景天科技苑
🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。
🏆《博客》:Python全栈,Golang开发,PyQt5和Tkinter桌面开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi,flask等框架,云原生K8S,linux,shell脚本等实操经验,网站搭建,数据库等分享。

所属的专栏:Go语言开发零基础到高阶实战
景天的主页:景天科技苑

在这里插入图片描述

文章目录

  • Go语言中运算符
    • 一、算术运算符
      • 1. 加法运算符(`+`)
      • 2. 减法运算符(`-`)
      • 3. 乘法运算符(`*`)
      • 4. 除法运算符(`/`)
      • 5. 取模运算符(`%`)
      • 6. 自增自减(++ --)
    • 二、赋值运算符
      • 1. 简单赋值运算符(=)
      • 2. 复合赋值运算符
    • 三、关系运算符
      • 1. 等于(`==`)
      • 2. 不等于(`!=`)
      • 3. 大于(`>`)、小于(`<`)、大于等于(`>=`)、小于等于(`<=`)
    • 四、逻辑运算符
      • 1. 逻辑与(`&&`)
      • 2. 逻辑或(`||`)
      • 3. 逻辑非(`!`)
    • 五、位运算符
      • 1. 按位与(`&`)
      • 2. 按位或(`|`)
      • 3. 按位异或(`^`)
      • 4. 按位取反(`^`,单独使用时)
      • 5. 按位左移(<<)
      • 6. 按位右移(>>)
    • 六、运算符优先级
    • 七、总结

Go语言中运算符

在Go语言中,运算符是编程中不可或缺的一部分,它们用于执行数学、逻辑和位运算等操作。理解这些运算符的工作原理及其与Go语言其他元素的交互,对于深入学习Go语言至关重要。本文将详细探讨Go语言中的各类运算符,包括算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符等,并通过实际案例展示其用法。

一、算术运算符

算术运算符用于执行基本的数学运算,如加、减、乘、除等。在Go语言中,这些运算符适用于整数、浮点数和复数等数值类型。

1. 加法运算符(+

加法运算符用于将两个数值类型的操作数相加。其语法为:result = operand1 + operand2

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    result := a + b
    fmt.Println("加法运算结果:", result) // 输出: 加法运算结果: 8

    // 字符串加法(拼接)
    str1 := "Hello"
    str2 := "World"
    resultStr := str1 + " " + str2
    fmt.Println("字符串拼接结果:", resultStr) // 输出: 字符串拼接结果: Hello World
}

2. 减法运算符(-

减法运算符用于从一个数值类型的操作数中减去另一个数值类型的操作数。其语法为:result = operand1 - operand2

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    result := a - b
    fmt.Println("减法运算结果:", result) // 输出: 减法运算结果: 2
}

3. 乘法运算符(*

乘法运算符用于两个数值类型的操作数相乘。其语法为:result = operand1 * operand2

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    result := a * b
    fmt.Println("乘法运算结果:", result) // 输出: 乘法运算结果: 15
}

4. 除法运算符(/

除法运算符用于一个数值类型的操作数除以另一个数值类型的操作数。其语法为:result = operand1 / operand2。注意,整数除法会向下取整。

示例

package main

import "fmt"

func main() {
    a := 10
    b := 3
    resultInt := a / b
    fmt.Println("整数除法结果:", resultInt) // 输出: 整数除法结果: 3

    aFloat := 10.0
    bFloat := 3.0
    resultFloat := aFloat / bFloat
    fmt.Println("浮点数除法结果:", resultFloat) // 输出: 浮点数除法结果: 3.3333333333333335
}

5. 取模运算符(%

取模运算符用于返回两个整数相除的余数。其语法为:result = operand1 % operand2

示例

package main

import "fmt"

func main() {
    a := 10
    b := 3
    result := a % b
    fmt.Println("取模运算结果:", result) // 输出: 取模运算结果: 1
}

6. 自增自减(++ --)

单元运算符,用自己就可以操作得出结果

package main

import "fmt"

func main() {
	// 算术运算符  ++ --
	var a int = 7

	// 单元运算符,用自己就可以操作得出结果
	//  自增++  自减--
	fmt.Println(a) // 7
	a++ // a = a + 1 自增,在自己的基础上 + 1
	fmt.Println(a)  // 8

	a = 7
	a-- // a = a-1。  自减 遍历输出一些东西(10000个数字)
	fmt.Println(a)  // 6

}

二、赋值运算符

赋值运算符用于将值赋给变量。
下表列出了所有Go语言的赋值运算符。
在这里插入图片描述

1. 简单赋值运算符(=)

案例:

a := 5  
b := 3  
b = a // b的值变为5  
fmt.Println("b:", b) // 输出: b: 5

2. 复合赋值运算符

案例:

a := 5  
b := 3  
b += a // b的值变为8  
fmt.Println("b:", b) // 输出: b: 8  
  
b *= 2 // b的值变为16  
fmt.Println("b:", b) // 输出: b: 16

三、关系运算符

关系运算符用于比较两个值,并返回一个布尔结果(truefalse)。

1. 等于(==

判断两个操作数是否相等。

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    result := a == b
    fmt.Println("a 是否等于 b:", result) // 输出: a 是否等于 b: false
}

2. 不等于(!=

判断两个操作数是否不相等。

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    result := a != b
    fmt.Println("a 是否不等于 b:", result) // 输出: a 是否不等于 b: true
}

3. 大于(>)、小于(<)、大于等于(>=)、小于等于(<=

分别用于判断左侧操作数是否大于、小于、大于等于、小于等于右侧操作数。

示例

package main

import "fmt"

func main() {
    a := 5
    b := 3
    fmt.Println("a 是否大于 b:", a > b) // 输出: a 是否大于 b: true
    fmt.Println("a 是否小于 b:", a < b) // 输出: a 是否小于 b: false
    fmt.Println("a 是否大于等于 b:", a >= b) // 输出: a 是否大于等于 b: true
    fmt.Println("a 是否小于等于 b:", a <= b) // 输出: a 是否小于等于 b: false
}

四、逻辑运算符

逻辑运算符用于构建布尔逻辑表达式,通常用于条件判断。

判断多个条件是否存在的时候,就需要逻辑

&& 与 只要有一个错,大家都是错的 false,两个都对才是对的。 多条件同时满足(与)

与(和) And 对 And 错 对 And 对(true) 错 And 对 错和错 共生!

|| 或 只要有一个对的,那么就是对的,两个都是错的,结果才是错的。(or)

或 Or 或者 对 or 错 (true) 对 or对(true) 错 or对 (true) 错or错 (错)

**!**如果是真的,那么为假,如果是假,则为真。

非(取反)

1. 逻辑与(&&

当两个条件都为真时,结果为真。

示例

package main

import "fmt"

func main() {
    a := true
    b := false
    result := a && b
    fmt.Println("a && b 的结果:", result) // 输出: a && b 的结果: false
}

2. 逻辑或(||

当至少一个条件为真时,结果为真。

示例

package main

import "fmt"

func main() {
    a := true
    b := false
    result := a || b
    fmt.Println("a || b 的结果:", result) // 输出: a || b 的结果: true
}

3. 逻辑非(!

取反一个条件的值。

示例

package main

import "fmt"

func main() {
    a := true
    result := !a
    fmt.Println("!a 的结果:", result) // 输出: !a 的结果: false
}

五、位运算符

位运算符用于对整数在内存中的二进制位进行操作,常用于底层编程、网络协议或哈希算法等场景。
Go 语言支持的位运算符如下表所示。
在这里插入图片描述

1. 按位与(&

对两个数的二进制进行按位与操作。

示例

package main

import "fmt"

func main() {
    a := 60 // 二进制: 0011 1100
    b := 13 // 二进制: 0000 1101
    result := a & b
    fmt.Printf("a & b 的结果: %d\n", result) // 输出: a & b 的结果: 12
}

2. 按位或(|

对两个数的二进制进行按位或操作。

示例

package main

import "fmt"

func main() {
    a := 60 // 二进制: 0011 1100
    b := 13 // 二进制: 0000 1101
    result := a | b
    fmt.Printf("a | b 的结果: %d\n", result) // 输出: a | b 的结果: 61
}

3. 按位异或(^

对两个数的二进制进行按位异或操作。

示例

package main

import "fmt"

func main() {
    a := 60 // 二进制: 0011 1100
    b := 13 // 二进制: 0000 1101
    result := a ^ b
    fmt.Printf("a ^ b 的结果: %d\n", result) // 输出: a ^ b 的结果: 49
}

4. 按位取反(^,单独使用时)

对二进制数的每一位进行取反操作。

示例

package main  
  
import "fmt"  
  
func main() {  
    a := 60 // 二进制: 0011 1100(这里假设是8位整数,实际中int类型通常占用更多位)  
    // 注意:在实际环境中,int类型通常占用32位或64位,但这里为了简化说明,我们假设是8位。  
  
    // 对a进行按位取反  
    result := ^a  
  
    // 因为a是正数,其二进制最高位(符号位)为0,取反后变为1,表示负数。  
    // 同时,其他位也取反。但直接打印负数可能不会直接显示其二进制形式,所以这里只做说明。  
  
    // 为了更直观地看到结果,我们可以将result转换为无符号整数来查看其二进制表示(忽略符号位的变化)  
    var unsignedResult uint8 = uint8(result) // 强制转换为uint8以忽略符号位的影响(仅用于展示目的)  
    fmt.Printf("a的二进制按位取反(忽略符号位): %08b\n", unsignedResult) // 输出a的二进制取反结果,忽略符号位的变化  
  
    // 注意:上面的转换仅用于演示目的,实际上^a得到的是一个int类型的负数。  
    // 如果你想查看这个负数的具体值,直接打印result即可。  
    fmt.Println("a的按位取反结果(作为int类型):", result) // 输出结果可能是一个负数  
}  
  
// 注意:上面的代码在真实环境中运行时,由于int类型的实际位数(32位或64位),直接打印^a的二进制表示并不直观。  
// 因此,这里使用uint8进行转换只是为了演示按位取反的二进制效果,并忽略符号位的影响。

5. 按位左移(<<)

左移运算符"<<“是双目运算符。左移n位就是乘以2的n次方。 其功能把”<<“左边的运算数的各二进位全部左移若干位,由”<<"右边的数指定移动的位数,高位丢弃,低位补0。

a := 60 // 二进制: 0011 1100  
b := 13 // 二进制: 0000 1101  
  
// 左移  
resultLeftShift := a << 2  
fmt.Printf("a << 2 = %d, Binary: %b\n", resultLeftShift, resultLeftShift) // 输出: a << 2 = 240, Binary: 11110000  
  

6. 按位右移(>>)

右移运算符">>“是双目运算符。右移n位就是除以2的n次方。 其功能是把”>>“左边的运算数的各二进位全部右移若干位,”>>"右边的数指定移动的位数。

a := 60 // 二进制: 0011 1100  
b := 13 // 二进制: 0000 1101  
  
// 右移  
resultRightShift := a >> 1  
fmt.Printf("a >> 1 = %d, Binary: %b\n", resultRightShift, resultRightShift) // 输出: a >> 1 = 30, Binary: 11110

六、运算符优先级

了解运算符的优先级对编写正确且高效的代码至关重要。Go语言中运算符的优先级遵循标准的数学规则,如乘法和除法先于加法和减法执行。可以使用括号()来改变默认的运算顺序。

案例

a := 10
b := 2
c := 3

// 不使用括号
result1 := a + b * c
fmt.Println("Result1:", result1) // 输出: Result1: 26,因为 b*c (2*3=6) 先于 a+ 执行

// 使用括号
result2 := (a + b) * c
fmt.Println("Result2:", result2) // 输出: Result2: 39,因为 (a+b) (10+2=12) 作为一个整体与 c 相乘

七、总结

本文详细介绍了Go语言中的各类运算符,包括算术运算符、赋值运算符、关系运算符、逻辑运算符和位运算符,并通过实际案例展示了它们的使用方法和应用场景。掌握这些运算符是编写Go语言程序的基础,希望本文对go语言初学者和进阶者都能有所帮助。

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

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

相关文章

路基边坡自动化监测解决方案

物联网云平台 平台登录--用户登录 输入网址&#xff1a;http://yun.sj2000.org.cn&#xff0c;进入系统登录界面&#xff0c;输入用户名及密码后进入系统平台。 设备详情--设备概览 登录系统平台后&#xff0c;用户可在界面左侧看到系统项目栏和子项目选项&#xff0c;登陆的…

【Python爬虫系列】_018.多线程与多进程

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉👉 Python项目虚拟环境(超详细讲解) 👈👈 PyQt5 系 列 教 程:👉👉 Python GUI(PyQt5)文章合集 👈👈 Oracle数…

3. 进阶指南:自定义 Prompt 提升大模型解题能力

怎么判断 Prompt 的好坏&#xff0c;有什么问题有着标准答案么&#xff1f; 答&#xff1a;让大模型求解数学问题。 李宏毅老师的 HW4 正好提到了有关数学问题的 Prompt&#xff0c;所以我决定中间插一篇这样的文章。通过本文你将&#xff1a; 了解各种 Prompt 如何影响大型语言…

基于asp.net电子邮件系统设计与实现

1 引言 1&#xff0e;1 电子邮件介绍 电子邮件(简称E-mai1)又称电子信箱、电子邮政&#xff0c;它是—种用电子手段提供信息交换的通信方式。它是全球多种网络上使用最普遍的一项服务。这种非交互式的通信,加速了信息的交流及数据传送,它是—个简易、快速的方法。通过连接全…

个人用户如何有效利用固态硬盘数据恢复工具

固态硬盘相较于机械硬盘来说更为小巧&#xff0c;所以很多人选择使用固态硬盘来进行数据的存储。这些存储设备都可能会遇到一些意外导致的数据丢失情况。好在现在的科技比较发达&#xff0c;这次我们来聊一聊有哪些固态硬盘数据恢复工具可以解决这个问题吧。 1.福晰数据恢复 …

Sentinel 高级

一、请求限流 1.介绍 处理并发量大时资源耗尽问题 Sentinel的请求限流功能主要体现在对QPS&#xff08;每秒查询率&#xff09;和线程数的控制上。当某个API接口或服务的请求量达到设定的QPS阈值时&#xff0c;Sentinel会触发限流规则&#xff0c;对这些超出阈值的请求进行限…

Selenium自动化测试面试题合集!

1、什么是自动化测试、自动化测试的优势是什么&#xff1f; 通过工具或脚本代替手工测试执行过程的测试都叫自动化测试。 自动化测试的优势&#xff1a; 1、减少回归测试成本 2、减少兼容性测试成本 3、提高测试反馈速度 4、提高测试覆盖率 5、让测试工程师做更有意义的…

官宣:Zilliz 在亚马逊云科技中国区正式开服!

01 Zilliz Cloud 正式上线亚马逊云科技宁夏区服务 9 月 4 日&#xff0c;Zilliz 正式官宣&#xff0c; Zilliz Cloud 正式上线亚马逊云科技在宁夏区的云服务。至此&#xff0c;Zilliz Cloud 已实现全球 5 大云 19 个节点 的全覆盖&#xff0c;成为全球首个提供海内外多云服务的…

读构建可扩展分布式系统:方法与实践01可扩展系统简介

1. 简介 1.1. 在过去20年里&#xff0c;软件系统的规模、复杂性和容量都出现了前所未有的增长 1.2. 代码是容器、数据库、消息传递系统和其他组件的一部分&#xff0c;通过调用API和构建指令&#xff0c;构成你的应用程序 1.3. 可扩展(scalable)是软件工程中用来描述软件系统…

WinCC Professional 变量的线性转换

把PLC中的变量进行线性转换的显示到WinCC Profession画面上&#xff0c;操作步骤如下&#xff1a; 1.在PLC的DB块中创建三个变量&#xff0c;如下所示&#xff1a; 2.在WinCC RT PRO的变量表中也同样创建三个变量&#xff0c;如下所示&#xff1a; 3.对WinCC RT PRO变量表中的…

3个热门、好用、功能强大的C#开源帮助工具类

下面推荐3个热门、好用、功能强大的C#开源帮助工具类。 1、Z.ExtensionMethods Z.ExtensionMethods是由zzzprojects公司开发并维护的一款开源库&#xff0c;为.NET开发人员提供一系列实用的扩展方法&#xff0c;可以减少重复劳动、提高开发效率&#xff0c;支持.NET Framewor…

快递柜电子锁的使用

一、快递柜电子锁的介绍 主要特点&#xff1a; 1、电源需求&#xff1a;该电子锁需要12伏特的直流电源供电&#xff0c;电流限制在2安培&#xff0c;“通电时间≤3S&#xff08;不可长时间通电&#xff09;”&#xff0c;以防止因长时间通电导致的损坏或安全隐患。 2、负荷&am…

DeepGaitV2:显式时间建模,CNN和Transformer在步态任务上的影响

Exploring Deep Models for Practical Gait Recognition 论文链接&#xff1a;http://arxiv.org/abs/2303.03301 代码链接&#xff1a;https://github.com/ShiqiYu/OpenGait 一、摘要 文中提出了一个统一的视角&#xff0c;探讨如何构建用于最先进的户外步态识别的深度模型&…

二层交换机如何工作

在学习之前&#xff0c;先提出几个问题&#xff1a; 二层交换机在哪里&#xff1f;二层交换机是怎么转发数据的&#xff1f;二层交换机如何生成mac地址表&#xff1f;二层交换机怎么去维护mac地址表&#xff1f; 二层交换机&#xff1a;二层交换机是工作在ISO/OSI模型第二层—…

力扣最热一百题——相交链表

题目链接&#xff1a;160. 相交链表 - 力扣&#xff08;LeetCode&#xff09; 注&#xff1a;下述题目描述和示例均来自力扣 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返…

【LabVIEW学习篇 - 23】:简单状态机

文章目录 简单状态机状态机的创建和了解状态机实现红绿灯 简单状态机 一个优秀的应用程序离不开好的程序框架&#xff0c;不仅要很好满足用户的功能需求&#xff0c;还要考虑到系统的稳定性、实时性、可扩展性、可维护性&#xff0c;执行效率等方面。借用一些成熟的设计框架&a…

Jmeter终极线程组“Ultimate Thread Group“如何使用?

1、安装,点击"选项"&#xff0c;再点击"Plugins Manager"&#xff0c;下载"Custom Thread Groups" 2、添加"jpgc - Ultimate Thread Group" 3、"jpgc - Ultimate Thread Group"使用

HarmonyOS开发5.0【骨架屏】 app界面制作

实现原理 1.定义组件和状态变量&#xff1a; 使用 Entry 和 Component 装饰器定义了一个名为 IvSkeleton 的组件。 定义了一个状态变量 translageX&#xff0c;初始值为 -100%&#xff0c;用于控制闪电效果的位置。 定义了两个数值变量 widthValue 和 heightValue&#xff0c;…

wangeditor——cdn引入的形式创建一个简易版编辑器——js技能提升

昨天同事那边有个需求&#xff0c;就是要实现聊天功能&#xff0c;需要用到一个富文本编辑器&#xff0c;参考如下&#xff1a; 上面的这个效果图是博客园的评论输入框 最终使用wangEditor编辑器实现的效果如下&#xff1a; 只保留了个别的菜单&#xff1a; 默认模式的wangE…

/bin/bash的作用

1、为啥使用不了很多命令&#xff1f; 我刚进入一个新系统&#xff1a; 我当时蒙蔽了&#xff0c;这是啥意思&#xff0c;为啥没命令? 原因是&#xff1a;当时进入的shell并没有初始化这些路径环境&#xff0c;所以正确的方法是&#xff1a; 2、/bin/bash运行的过程中执行…