go中+=与=不等价,因+=支持常量类型推导而=不支持隐式转换;位移运算右操作数须为非负整数,不取模且负数直接报错。

Go 里 += 和 = 不是等价替换,类型必须严格一致
Go 是强类型语言,+= 等复合赋值运算符不会做隐式类型转换。哪怕右边是常量,只要左边变量类型和右边推导出的类型不一致,就报错。
常见错误现象:cannot assign int to int32 in assignment 或类似类型不匹配提示。
- 如果
a是int32,写a += 1是合法的(字面量1可无歧义推导为int32) - 但
a = a + 1就会失败:因为a + 1中1默认是int,int32 + int不合法 - 正确写法是显式转换:
a += int32(1)或a = a + int32(1) - 在跨平台代码中尤其要注意:
int在 32 位和 64 位系统下宽度不同,而int32/int64是确定的
位移运算符 和 <code>>> 的右操作数不能是负数,且不自动取模
Go 的位移运算不支持负数位移,也不像某些语言(如 Python)那样对位数取模。右操作数必须是非负整数,否则编译直接报错。
常见错误现象:invalid operation: shift of type int by negative number,或运行时 panic(如果右操作数是变量且值为负)。
立即学习“go语言免费学习笔记(深入)”;
1 编译失败1 对 <code>int64来说不 panic,但结果是 0(溢出后截断),不是循环位移- 右操作数如果是变量,建议加校验:
if n = 64 { panic("shift amount out of range") } - 注意:位移的左操作数类型决定了结果位宽,
uint8(1) 结果仍是 <code>uint8,高位被丢弃
算术运算溢出在 Go 中默认不检查,但 math 包提供带检查的版本
Go 的 +、-、* 等运算符在整数溢出时静默截断(二进制补码行为),不会 panic 或报错。这容易埋下隐蔽 bug。
使用场景:金融计算、索引边界、协议解析等对数值安全性要求高的地方。
- 启用溢出检查需手动调用
math.AddUint64、math MulInt32等函数,它们返回(result, bool),第二个 bool 表示是否溢出 -
math.MaxInt64 + 1得到math.MinInt64,而非 panic - 开启
go build -gcflags="-d=checkptr"无法捕获算术溢出,它只检查指针越界 - 第三方库如
golang.org/x/exp/constraints(实验包)暂未提供泛型安全算术,目前仍需按类型选函数
浮点数用 == 判断相等几乎总是错的,优先用 math.Abs(a-b)
Go 没有内置的“近似相等”运算符。直接用 == 比较两个 float64 计算结果,大概率得到 false,即使数学上应相等。
常见错误现象:单元测试随机失败、条件判断跳过预期分支。
- 不要写
if a == b(其中 a、b 是浮点计算结果) - 改用
if math.Abs(a-b) ,epsilon 大小取决于业务精度需求(坐标计算常用 <code>1e-6,科学计算可能要1e-15) -
math.IsNaN和math.IsInf应先于比较调用,避免NaN == NaN返回 false 导致逻辑异常 - 注意:
1.0/3.0*3.0 == 1.0在 Go 中是false,不是 bug,是 IEEE 754 必然结果










