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语言免费学习笔记(深入)”;
类型必须严格匹配
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(泛型前常用) - Go 1.21+ 可配合
unsafe.Add等做底层校验(高级场景)
日常开发中,对用户输入、循环计数、索引计算等关键位置,建议主动校验。
基本上就这些。Go的数值运算是直白而严格的——没有魔法,但有确定性。写清楚类型、加好括号、留心溢出,就能避开大多数坑。










