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

GO学习日志10

运算符

算术运算符

Go语言支持以下基本算术运算符:

+加法运算符
-减法运算符
*乘法运算符
/除法运算符
%取模(余)运算符

加法运算符示例

a := 10 + 5 // 结果为15 b := 3.14 + 2.71 // 结果为5.85

减法运算符示例

x := 20 - 8 // 结果为12 y := -5 - 3 // 结果为-8

乘法运算符示例

m := 6 * 7 // 结果为42 n := 2.5 * 4 // 结果为10.0

除法运算符示例

整数除法会截断小数部分:

p := 10 / 3 // 结果为3

浮点数除法会保留小数:

q := 10.0 / 3 // 结果为3.333...

取模运算符示例

仅适用于整数类型:

r := 10 % 3 // 结果为1 s := -10 % 3 // 结果为-1

实际上取余运算是可以用公式表达:余数=被除数-(被除数/除数)*除数

自增自减运算符

++自增运算符
--自减运算符

  • 前置形式(如++i--i)在Go中是无效语法,会导致编译错误。

只能作为语句使用,不能出现在表达式(包括赋值)中:

package main import "fmt" func main() { i := 1 i++ // 合法 fmt.Println(i) // 输出: 2 j := 5 j-- // 合法 fmt.Println(j) // 输出: 4 // ++i 或 --j 会导致编译错误 // 错误示例: syntax error: unexpected ++, expecting } }

关系运算符种类

Go语言中的关系运算符用于比较两个值,返回布尔值truefalse。以下是所有关系运算符:

  • ==:等于
  • !=:不等于
  • <:小于
  • <=:小于或等于
  • >:大于
  • >=:大于或等于
a := 10 b := 20 result := a == b // false
x := "hello" y := "world" result := x != y // true
num1 := 15 num2 := 25 result := num1 < num2 // true

注意事项

  • 关系运算符只能用于可比较的类型(如数值、字符串、布尔值等)。
  • 比较不同类型的变量会导致编译错误。
  • 浮点数的比较可能存在精度问题,需谨慎处理。

逻辑运算符种类

Go语言支持以下三种逻辑运算符:

  • &&(逻辑与):当两边的表达式均为true时返回true,否则返回false
  • ||(逻辑或):当任意一边的表达式为true时返回true,否则返回false
  • !(逻辑非):对布尔值取反,truefalsefalsetrue

使用方式示例

逻辑与(&&)
a := true b := false result := a && b // false(因为b为false) fmt.Println(result)
逻辑或(||)
x := 10 y := 20 result := (x > 5) || (y < 10) // true(x > 5为true) fmt.Println(result)
逻辑非(!)
flag := true result := !flag // false fmt.Println(result)

短路行为说明

  • &&:若左侧表达式为false,右侧表达式不会执行。
  • ||:若左侧表达式为true,右侧表达式不会执行。
func check() bool { fmt.Println("执行检查") return true } func main() { a := false result := a && check() // check()不会执行 fmt.Println(result) }

优先级规则

  1. !优先级最高。
  2. &&优先级高于||
  3. 可通过括号()显式控制运算顺序。

赋值运算符种类及使用方式

Go语言中的赋值运算符用于将值赋给变量,以下是常见的赋值运算符及其使用方式:

运算符描述示例等价于
=简单赋值x = 10x = 10
+=加后赋值x += 5x = x + 5
-=减后赋值x -= 3x = x - 3
*=乘后赋值x *= 2x = x * 2
/=除后赋值x /= 4x = x / 4
%=取模后赋值x %= 3x = x % 3
&=按位与后赋值x &= 0x0Fx = x & 0x0F
|=按位或后赋值x |= 0x0Fx = x | 0x0F
^=按位异或后赋值x ^= 0x0Fx = x ^ 0x0F
<<=左移后赋值x <<= 2x = x << 2
>>=右移后赋值x >>= 1x = x >> 1
package main import "fmt" func main() { // 简单赋值 x := 10 fmt.Println("x =", x) // 加后赋值 x += 5 fmt.Println("x += 5 ->", x) // 减后赋值 x -= 3 fmt.Println("x -= 3 ->", x) // 乘后赋值 x *= 2 fmt.Println("x *= 2 ->", x) // 除后赋值 x /= 4 fmt.Println("x /= 4 ->", x) // 取模后赋值 x %= 3 fmt.Println("x %= 3 ->", x) // 按位与后赋值 x &= 0x0F fmt.Println("x &= 0x0F ->", x) // 按位或后赋值 x |= 0x0F fmt.Println("x |= 0x0F ->", x) // 按位异或后赋值 x ^= 0x0F fmt.Println("x ^= 0x0F ->", x) // 左移后赋值 x <<= 2 fmt.Println("x <<= 2 ->", x) // 右移后赋值 x >>= 1 fmt.Println("x >>= 1 ->", x) }

运行上述代码后,输出结果可能如下:

x = 10 x += 5 -> 15 x -= 3 -> 12 x *= 2 -> 24 x /= 4 -> 6 x %= 3 -> 0 x &= 0x0F -> 0 x |= 0x0F -> 15 x ^= 0x0F -> 0 x <<= 2 -> 0 x >>= 1 -> 0

注:0x0f等于十进制的15

位运算符

用于直接操作整数的二进制位

按位与(&)

对两个操作数的每一位执行逻辑与操作,只有对应位都为1时结果位才为1。

a := 5 // 0101 b := 3 // 0011 result := a & b // 0001 (1)

按位或(|)

对两个操作数的每一位执行逻辑或操作,只要对应位有一个为1结果位就为1。

a := 5 // 0101 b := 3 // 0011 result := a | b // 0111 (7)

按位异或(^)

对两个操作数的每一位执行异或操作,对应位不同时结果位为1。

a := 5 // 0101 b := 3 // 0011 result := a ^ b // 0110 (6)

按位取反(^)

一元运算符,对操作数的每一位取反(0变1,1变0)。

a := 5 // 0101 result := ^a // 1010 (取决于整数位数,结果为-6)

左移位(<<)

将左操作数的二进制位向左移动右操作数指定的位数,低位补0。

a := 1 // 0001 result := a << 3 // 1000 (8)

右移位(>>)

将左操作数的二进制位向右移动右操作数指定的位数,高位补符号位。

a := 8 // 1000 result := a >> 3 // 0001 (1)

无符号右移位(>>>)

Go语言没有单独的无符号右移运算符,可以通过类型转换实现。

a := -8 result := uint(a) >> 3 // 高位补0

位运算应用场景

位运算常用于以下场景:

  • 权限控制(用位掩码表示不同权限)
  • 性能优化(替代部分算术运算)
  • 数据压缩(位级操作)
  • 加密算法(位级变换)

注意事项

使用位运算时需要注意:

  • 操作数必须是整数类型
  • 移位运算的右操作数应小于左操作数的位数
  • 无符号整数的右移与有符号整数不同
  • 位运算优先级低于算术运算,建议使用括号明确优先级
http://www.jsqmd.com/news/633829/

相关文章:

  • 面向对象语法糖ArrayList集合,队列,栈泛型与异常
  • XRECODE3音频格式转换:音频格式转换软件轻松解决MP3转换与批量处理难题
  • 自动COD分析仪品牌对比:四家国产厂家的产品特点与适用场景 - 品牌推荐大师1
  • 《SAP FICO系统配置从入门到精通共40篇》003、SAP FICO核心组织架构:公司代码、信贷控制范围
  • 别再手动转格式了!用MATLAB+ENVI 5.6从.mat到3D高光谱立方体的保姆级流程
  • 储能系统数据采集与监控一体化融合架构设计:基于边缘微服务并发本地 Web 监控与 MQTT 上云的实现
  • 喜马拉雅FM下载器GUI:跨平台音频下载的终极解决方案
  • HEIF Utility:Windows平台HEIF图像格式转换的终极解决方案
  • 溯源难题破解:搭建向量数据与原始文件的精准映射关系
  • dashscope-sb20260413
  • AD域管理员必看:UserAccountControl属性详解与常见配置误区避坑指南
  • 017、归一化层改进策略:从训练震荡到推理加速的实战调优
  • C#学习笔记2
  • **张量核心驱动下的编程语言革新:从PyTorch到自定义DSL的实践与思考**在深度学习迅
  • 如何用IDR破解Delphi程序迷局:3个关键技术突破与实战应用
  • 主流老人轮椅品牌对比:谁才是真正的安心之选? - 资讯焦点
  • AI 日报 - 2026年4月13日
  • 给openclaw配置Chrome远程调试
  • 文脉定序实战教程:如何将BGE-Reranker-v2-m3集成进现有ES/Meilisearch检索链
  • 从文字到视觉:Text2Image注意力机制图像生成开源方案
  • 3步解决黑苹果EFI配置难题:OpCore-Simplify让你的黑苹果之旅轻松上手
  • 从零到一:基于51单片机与DS18B20的智能温度监控系统实战
  • MySQl语句中别名引用的误点
  • 南京离婚律师事务所哪个靠谱 - 资讯焦点
  • 《SAP FICO系统配置从入门到精通共40篇》004、财务会计全局性配置:会计年度与货币设置:那些年我们踩过的“时间”与“钱”的坑
  • 基于深度学习CNN的智慧电力电缆状态巡检 电力线路覆冰状态 电力线路覆冰检测数据集 电力巡检系统实现覆冰风险自动识别第10413期 (1)
  • BN / LN / RMSNorm
  • 终极生物图像分析指南:如何用CellProfiler自动处理数千张图像
  • Rust的Pin类型:理解自引用结构体的安全固定
  • 设计企业级SKILL的7个最佳实战原则