Go语言数值运算要求类型严格匹配、不支持隐式转换,运算符优先级明确且左结合,整数溢出不自动检测需手动防护。
Go语言的数值运算和其他主流编程语言类似,但有自己明确的规则和限制。它不支持隐式类型转换,运算符优先级清晰,且整数溢出不会自动处理(需手动检查或使用math包辅助)。掌握这些基础,能避免常见错误,写出更健壮的代码。
Go支持常见的二元算术运算符,全部为左结合:
7 / -3 得 -2)-7 % 3 得 -1)a = b++ 是非法的)Go中运算符优先级从高到低依次为(同级左结合):
++、--
+ - ! ^ * &
* / % > & &^
+ - | ^
== != >=
&&
||
= += -= *= /= %= >= &= ^= |=
例如:a + b &^ c 等价于 (a + b) &^ c;a & b == c 等价于 a & (b == c)(因==优先级高于&),这点容
易出错,建议加括号明确意图。
Go不允许不同数值类型直接运算。比如 int 和 int64 不能相加,float32 和 float64 也不行:
var a int = 5✅ 正确做法:
var b int64 = 10
c := a + b // 编译错误:mismatched types int and int64
显式转换(注意转换不改变原值,只生成新值):
c := int64(a) + bd := float64(a) / float64(b)切记:无符号整型(如uint)与有符号整型(如int)也不能混用,即使位宽相同。
Go默认不检测整数溢出。超出范围时结果按补码截断(即“绕回”):
var x uint8 = 255
x++ // x 变成 0,不会报错也不会 panic
如需安全运算,可:
math 包的 MaxInt64、MinInt32 等常量做边界判断-gcflags="-d=checkptr"(仅调试)golang.org/x/exp/constraints(实验性)或 github.com/cheekybits/genny(泛型前常用)unsafe.Add 等做底层校验(高级场景)日常开发中,对用户输入、循环计数、索引计算等关键位置,建议主动校验。
基本上就这些。Go的数值运算是直白而严格的——没有魔法,但有确定性。写清楚类型、加好括号、留心溢出,就能避开大多数坑。