Go的运算符解密:探索计算的奥秘

news2025/6/22 23:50:16

目录

算术运算符

赋值运算符

比较运算符

逻辑运算符

位运算符

其他运算符

运算符优先级

代码示例


图片

更多关于Go的相关技术点,敬请关注公众号:CTO Plus后续的发文,有问题欢迎后台留言交流。

图片

原文:Go的运算符解密:探索计算的奥秘

本篇文章我将总结介绍下Go语言中关于运算符的知识点。

图片

Go语言中的运算符用于执行各种数学和逻辑操作。本文我将详细介绍Go语言中常用的运算符,包括算术运算符、赋值运算符、比较(关系)运算符、逻辑运算符、位运算符和其他运算符。

算术运算符

Go语言中的算术运算符用于执行基本的数学运算,如加法、减法、乘法和除法。

  1. 加法运算符(+):用于将两个操作数相加,如a + b。

  2. 减法运算符(-):用于将第一个操作数减去第二个操作数,如a - b。

  3. 乘法运算符(*):用于将两个操作数相乘,如a * b。

  4. 除法运算符(/):用于将第一个操作数除以第二个操作数,如a / b。

  5. 取余运算符(%):用于获取两个操作数相除的余数,如a % b。

赋值运算符

赋值运算符用于将一个值赋给变量。

  1. 简单赋值运算符(=):将右边的值赋给左边的变量,如a = b,简单的赋值运算符,将一个表达式的值赋给一个左值。

  2. 加法赋值运算符(+=):将右边的值与左边的变量相加,并将结果赋给左边的变量(相加后再赋值),如a += b。

  3. 减法赋值运算符(-=):将右边的值与左边的变量相减,并将结果赋给左边的变量(相减后再赋值),如a -= b。

  4. 乘法赋值运算符(*=):将右边的值与左边的变量相乘,并将结果赋给左边的变量(相乘后再赋值),如a *= b。

  5. 除法赋值运算符(/=):将左边的变量除以右边的值,并将结果赋给左边的变量(相除后再赋值),如a /= b。

  6. 取余赋值运算符(%=):将左边的变量除以右边的值的余数,并将结果赋给左边的变量(求余后再赋值),如a %= b。

  7. <<=:左移后赋值。

  8. >>=:右移后赋值。

  9. &=:按位与后赋值。

  10. l=:按位或后赋值。

  11. ^=:按位异或后赋值。

比较运算符

比较运算符用于比较两个值的大小或相等性。

  1. 相等运算符(==):判断两个值是否相等,如a == b,如果相等返回 True 否则返回 False。

  2. 不等运算符(!=):判断两个值是否不相等,如a != b,如果不相等返回 True 否则返回 False。

  3. 大于运算符(>):判断第一个值是否大于第二个值,如a > b,如果是返回 True 否则返回 False。

  4. 小于运算符(<):判断第一个值是否小于第二个值,如a < b,如果是返回 True 否则返回 False。

  5. 大于等于运算符(>=):判断第一个值是否大于等于第二个值,如a >= b,如果是返回 True 否则返回 False。

  6. 小于等于运算符(<=):判断第一个值是否小于等于第二个值,如a <= b,如果是返回 True 否则返回 False。

逻辑运算符

逻辑运算符用于对布尔值进行逻辑运算。

  1. 逻辑与运算符(&&):逻辑 AND 运算符。判断两个布尔值是否都为真,如果两边的操作数都是 True,则为 True,否则为 False。如a && b。

  2. 逻辑或运算符(||):逻辑 OR 运算符。判断两个布尔值是否至少有一个为真,如果两边的操作数有一个 True,则为 True,否则为False。如a || b。

  3. 逻辑非运算符(!):逻辑 NOT 运算符。对布尔值进行取反操作,如果条件为 True,则为 False,否则为True。如!a。

位运算符

位运算符对整数在内存中的二进制位进行操作。

  1. 按位与运算符(&):对两个整数的每个位进行与操作,如a & b,参与运算的两数各对应的二进位相与。(两位均为1才为1)。

  2. 按位或运算符(|):对两个整数的每个位进行或操作,如a | b,参与运算的两数各对应的二进位相或。(两位有一个为1就为1)。

  3. 按位异或运算符(^):对两个整数的每个位进行异或操作,如a ^ b,参与运算的两数各对应的二进位相异或,当两对应的二进位相异时,结果为1。(两位不一样则为1)。

  4. 左移运算符(<<):将一个整数的每个位向左移动指定的位数,如a << b,左移n位就是乘以2的n次方。“a<<b”是把a的各二进位全部左移b位,高位丢弃,低位补0。

  5. 右移运算符(>>):将一个整数的每个位向右移动指定的位数,如a >> b,右移n位就是除以2的n次方。“a>>b”是把a的各二进位全部右移b位。

其他运算符

除了上述常用的运算符,Go语言还提供了其他一些特殊的运算符。

  1. 地址运算符(&):用于获取变量的内存地址,如&a。

  2. 指针运算符(*):用于声明指针变量或通过指针间接访问变量,如*ptr。

  3. 自增运算符(++):将变量的值增加1,如a++。

  4. 自减运算符(--):将变量的值减少1,如a--。

注意:

++(自增)和--(自减)在Go语言中是单独的语句,并不是运算符。

Go不支持这种三目运算符,Python中支持,条件运算符(?:):根据条件选择不同的值,如a > b ? a : b。

运算符优先级

以下是Go语言中运算符的优先级顺序(从高到低):

1. 括号:()

2. 单目运算符:+(正号)、-(负号)、!(逻辑非)、^(按位取反)

3. 乘法和除法运算符:*(乘法)、/(除法)、%(取模)

4. 加法和减法运算符:+(加法)、-(减法)

5. 位运算符:<<(左移)、>>(右移)、&(按位与)、|(按位或)、^(按位异或)

6. 关系运算符:==(等于)、!=(不等于)、<(小于)、>(大于)、<=(小于等于)、>=(大于等于)

7. 逻辑运算符:&&(逻辑与)、||(逻辑或)

8. 位清空运算符:&^(按位清零)

9. 赋值运算符:=、+=、-=、*=、/=、%=、<<=、>>=、&=、|=、^=、&^=

10. 逗号运算符:,

需要注意的是,运算符的优先级决定了表达式中运算符的结合性和计算顺序。如果表达式中有多个运算符,优先级高的运算符会先进行计算。如果优先级相同的运算符出现在同一表达式中,根据结合性从左到右或从右到左进行计算。

代码示例

package main

import "fmt"

/*
   Go没有三元操作符
   !和<-可以用于一元和二元操作符来使用
   <-接收操作符

   7个算术操作符只能作用于整数:%、&、|、^、&^、<<、>>

   =  用于将一个值赋给一个已被声明的变量或常量
   :=  用于在声明一个变量的同时对这个变量进行赋值,且只能在函数体内使用

   ++、--是语句不是表达式
     *p--  等同于 (*p)--
*/

func operator01() {
  //+ 连接符
  //只会创建并使用一个新的字符串值来保存操作结果,而不会改变任何操作数的值
  fmt.Println("Hello" + "GoLang" + "!")
  var str1 string = "Numbers:"
  fmt.Println(str1)
  fmt.Println(str1 + string(111)) //Numbers:o   Python中OK
  // fmt.Println(str1+111)  error  字符串和数字不能使用连接符

  //取出变量str1的地址
  fmt.Println(&str1)
  //根据地址取出值
  fmt.Println(*&str1)

  //  <- 接收操作符
  //  用于通道类型的值
  /*
    从一个通道类型的空值nil 接收值的表达式将会永远被阻塞
    从一个已被关闭的通道类型值接收值会永远成功并立即返回一个其元素类型的零值
    一个由接收操作符和通道类型的操作数所组成的表达式可以直接被用于变量赋值或初始化
  */
  // <- ch

  // v1 := <-ch
  // v2 = <-ch

  // v, ok = <-ch
  // v, ok := <-ch
  // 通过同时对两个变量进行赋值或初始化  第二个变量将会是一个bool类型的值  表示接受操作的成功与否,可以通过它来判断一个通道是否已被关闭,如果值为false  就表示通道已关闭
}

func operator02() {
  num1 := 5
  num2 := 9
  //num1 > num2 ? num1 : num2  // Go不支持这种写法
  fmt.Println(num1 + num2)
  fmt.Println(num1 - num2)
  fmt.Println(num1 * num2)
  fmt.Println(num1 / num2)
  fmt.Println(num1 % num2)
  num2 <<= 2
  fmt.Println(num2)
  num2 >>= 2
  fmt.Println(num2)
  num2 &= 2
  fmt.Println(num2)
  num2 |= 2
  fmt.Println(num2)
  num2 ^= 2
  fmt.Println(num2)
  /* outputs
  14
  -4
  45
  0
  5
  36
  9
  0
  2
  0
  */
}


func operator03() {
  //关系运算符
  num1 := 11
  num2 := 11
  num3 := 0
  isEqual := num1 == num2
  isNotEqual := num1 != num2
  isLess := num1 < num3
  isLessOrEqual := num1 <= num2
  fmt.Println(isEqual)       // true
  fmt.Println(isNotEqual)    // true
  fmt.Println(isLess)        // true
  fmt.Println(isLessOrEqual) // true

  // 逻辑运算符
  addr := &num1             // 取变量num1的地址
  result := *addr           // 解引用变量addr,得到变量num1的值
  fmt.Println(addr, result) // 0xc00001c098 11
  typeOfAddr := reflect.TypeOf(addr)
  typeOfResult := reflect.TypeOf(result)
  fmt.Println(typeOfAddr, typeOfResult) //  *int int
}

以上是Go语言中常用的运算符及其用法。运算符是编程语言中非常基础和重要的概念,熟练掌握运算符的使用可以帮助我们进行各种数学和逻辑操作。

更多精彩,关注我公号,一起学习、成长

推荐阅读:

  • 开源项目 | 17款云原生安全相关的扫描和平台类开源工具

  • Go语言常量解密:恒定不变的值(const与iota)(附代码示例)
    深入了解Go语言的数据类型

  • 使用strconv进行Go的 int、float、string类型相互转换:灵活转换数据类型

  • Go语言变量的生命周期与作用域

  • Go中字符串的遍历技巧:轻松操作文本

  • Go语言字符串操作大揭秘:高效处理文本

  • Go的流程控制(if、for、switch、goto)全面解析与刨坑

  • Go的多端开发环境与编译器的搭建详解(图文)

  • Go语言的高级特性,发展趋势,以及推荐最热门的开源项目

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

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

相关文章

论文阅读之【Is GPT-4 a Good Data Analyst?(GPT-4是否是一位好的数据分析师)】

文章目录 论文阅读之【Is GPT-4 a Good Data Analyst?&#xff08;GPT-4是否是一位好的数据分析师&#xff09;】背景&#xff1a;数据分析师工作范围基于GPT-4的端到端数据分析框架将GPT-4作为数据分析师的框架的流程图 实验分析评估指标表1&#xff1a;GPT-4性能表现表2&…

日语学习网站web项目

支持日语五十音,平片假名、罗马音、词义转换、百度翻译功能,方便日语初学者学习日语发音 介绍 采用vitevue3ts技术栈开发, pinia管理全局化。主要是为了日语入门学习五十音, 以及日语句子罗马 发音对照练习。 参考以下两个项目完成 https://github.com/hexenq/kuroshiro ht…

SpringMVC的请求处理

请求映射路径的配置 请求映射路径的配置主要是通过RequestMapping注解实现的 相关注解作用使用位置RequestMapping设置控制器方法访问路径的资源&#xff0c;可以接收任何请求方法和类上GetMapping设置控制器方法访问路径的资源&#xff0c;可接收GET请求方法和类上PostMappin…

绿源正式登陆港股,行业老将凭原创科技走向新未来

两轮电动车领域历史最悠久的老将之一——绿源&#xff0c;正式掀开发展之路的新篇章。10月12日&#xff0c;绿源正式登陆港交所&#xff0c;上市首日股价开盘向上&#xff0c;涨幅一度超过9%。 此前&#xff0c;绿源的招股书失效以及在地方抽检中出现的负面新闻&#xff0c;引…

YOLOv7改进策略:RIFormerBlock助力检测|CVPR2023 RIFormer:无需TokenMixer也能达成SOTA性能的极简ViT架构

💡💡💡本文属于原创独家改进: 稀疏重参数RIFormerBlock模型引入YOLOv7进行创新性 RIFormerBlock | 亲测在多个数据集实现涨点; 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 🚀🚀🚀YOLOv7自研创新结合,轻松…

微信支付(小程序)

1、配置回调地址 2、小程序和微信支付进行绑定 3、小程序支付需要获取openId 4、uniapp中支付的关键代码 uni.requestPayment({"provider": "wxpay", "orderInfo": {"appid": "wx499********7c70e", // 微信开放平台 - 应…

如何给视频加上酷炫边框?简单几步搞定

随着社交媒体的普及&#xff0c;越来越多的人开始关注如何给自己的视频加上炫的边框&#xff0c;以增加观赏性和吸引力。而乔拓云作为一款在线海报制作工具&#xff0c;为这一需求提供了便捷的解决方案。下面就让我们一起来看看如何通过乔拓云给视频加上酷炫边框吧&#xff01;…

HPE设备固件升级步骤

一.打开HPE的support官网 https://support.hpe.com/connect 二.搜索需要的设备型号 三.搜索需要的固件 四.选择需要安装的版本及环境 5.下载与安装&#xff0c;也可以查看历史版本

“上海设计100+”和“设享奖EDW”先后揭晓,深兰科技皆获大奖

国庆前夕&#xff0c;“上海设计100”和“设享奖EDW”两项产品设计大奖的获奖榜单先后揭晓&#xff0c;深兰科技出品的计算机视觉工业检测标准化设备-剑齿虎在两项大奖的评选中皆获大奖。 01上海设计100——2023世界设计之都大会 9月26日&#xff0c;由上海市人民政府主办&…

Latex写作如何划钩与打叉

文章目录 概要实现在这里插入代码片效果 概要 我们经常在论文写作中需要划钩 “√” 与打叉 “”&#xff0c;本文介绍在latex中的几种实现方式。 实现在这里插入代码片 \documentclass{article} \usepackage{bbding} %重要&#xff1a;首先在导言区调用bbding包\begin{docu…

PCB射频天线设计基本要点及布局技巧

射频天线设计与布局是需要认真关注细节的领域之一&#xff0c;也是混合信号设计师给出的一些提示。如果刚开始接触高频模拟设计&#xff0c;可采用本文给出的这些技巧&#xff0c;以确保RF设计具有良好的隔离效果和信号完整性。 如今&#xff0c;人们已很难想到哪个消费产品不含…

软件分享--星空五子棋

如果你喜欢下五子棋&#xff0c;可以尝试星空五子棋&#xff0c;一款能够与你下五子棋的电脑游戏 六种电脑AI难度、每种AI具有不同的性格&#xff0c;好像在与不同的棋手较量 难度一&#xff1a;急于进攻的AI&#xff0c;容易被击败 难度二&#xff1a;温柔的AI&#xff0c;不…

防静电门禁闸机管理系统的优点有哪些

防静电门禁管理系统是一种专门针对静电敏感场所设计的门禁管理系统&#xff0c;其主要优点包括&#xff1a; 防止静电干扰&#xff1a;防静电门禁管理系统采用了防静电材料和设计&#xff0c;能够有效地防止静电干扰&#xff0c;保障设备和人员的安全。 提高门禁安全性&#x…

echarts 多y轴 数据有负数导致0刻度线不对齐

修改前&#xff1a; let y1Data [2.0, 4.9, 7.0, 23.2, 25.6, -76.7, 135.6, 162.2, 32.6, 20.0, 6.4, 3.3] let y2Data [2.6, 5.9, 9.0, 26.4, 28.7, 70.7, 175.6, 182.2, 48.7, 18.8, 6.0, 2.3] let rowNum 6; let max1 y1Data.length ! 0 ? Math.max(...y1Data) : 1;…

STM32CubeMX使用

一、新建工程 首先&#xff0c;打开STM32CubeMX&#xff0c;第一次使用的朋友可以点击右侧的CHECK FOR UPDATE和INSTALL/REMOVE检查一下软件更新并且找到对应芯片的固件库然后下载&#xff0c;软件和固件库都推荐是使用最新版的&#xff0c;这里不多介绍。 完毕之后点击File-&…

漏刻有时数据可视化Echarts组件开发(40)pictorialBar象形柱图

pictorialBar象形柱图 type&#xff1a;必须在ECharts 5.0以后的版本中设置&#xff0c;值为’pictorialBar’。name&#xff1a;系列名称&#xff0c;用于tooltip的显示&#xff0c;legend的图例筛选&#xff0c;在setOption更新数据和配置项时用于指定对应的系列。legendHov…

nodejs+vue+elementui实验室预约管理系统

简单的说 Node.js 就是运行在服务端的 JavaScript。 前端技术&#xff1a;nodejsvueelementui 前端&#xff1a;HTML5,CSS3、JavaScript、VUE实验室如何适应新的时代和新的潮流,开展有效的信息服务工作,完成时代赋予的新使命?本文就这一问题谈谈几点粗浅的看法.扩大业务范围,更…

HarmonyOS 远端状态订阅开发实例

IPC/RPC 提供对远端 Stub 对象状态的订阅机制&#xff0c; 在远端 Stub 对象消亡时&#xff0c;可触发消亡通知告诉本地 Proxy 对象。这种状态通知订阅需要调用特定接口完成&#xff0c;当不再需要订阅时也需要调用特定接口取消。使用这种订阅机制的用户&#xff0c;需要实现消…

金融新应用潮涌,银行如何加强数据安全韧性?

文 | 螳螂观察 作者 | 李永华 竞争白热化下&#xff0c;业务创新已经成为银行等金融企业普遍的追求。 以地方商业银行为代表&#xff0c;为了争夺市场、突破“大行”势能、让企业发展更进一步&#xff0c;新型应用正在快速落地&#xff0c;带来全新的竞争力。 但是&#xf…

Winform圆角用户控件的软件实现

1、文件结构 2、控件视图 3、程序代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading…