math/big 包用于高精度运算,支持超大整数且不溢出;需用指针和构造方法初始化;所有操作为原地方法调用,返回自身以支持链式调用;转换需显式处理;应复用对象以减少 GC 压力。

Go 语言的 math/big 包专为高精度整数、有理数和浮点数设计,能安全处理远超 int64 范围的大整数(如几百位甚至上万位),且完全避免溢出。它不提供运算符重载,所有操作都通过方法调用完成,虽然写法略显冗长,但逻辑清晰、内存可控、线程安全。
初始化和基本赋值
不能直接用字面量赋值,必须用指针类型 *big.Int 并借助构造方法:
-
new(big.Int)创建零值对象; -
big.NewInt(n)初始化小整数(n是int64); -
new(big.Int).SetString("12345678901234567890", 10)从字符串解析任意长度整数(支持二进制、十六进制等进制); - 注意:所有方法默认修改接收者(即原地操作),如需保留原值,应先用
Set()复制。
四则运算与常用操作
所有运算都以链式方法形式提供,返回接收者自身(便于链式调用),不创建新对象(除非显式调用 new 或 Set):
- 加:
a.Add(a, b)—— 等价于a = a + b; - 减:
a.Sub(a, b); - 乘:
a.Mul(a, b); - 除:
a.Div(a, b)(向零取整),余数用a.Rem(a, b); - 幂:
a.Exp(base, exponent, nil)(第三个参数为模数,设为nil表示无模); - 比较:
a.Cmp(b)返回 -1 / 0 / 1,常配合if a.Cmp(b) == 0判断相等。
转换与输出控制
与基础类型互转需显式处理,避免隐式截断风险:
立即学习“go语言免费学习笔记(深入)”;
- 转为
int64:用a.Int64()(若超出范围会回绕,应先用a.BitLen() 检查); - 转为字符串:
a.String()(十进制)、a.Text(16)(指定进制,如 16 进制); - 从字节切片构造:
new(big.Int).SetBytes([]byte{0x01, 0x02})(大端编码); - 导出为字节切片:
a.Bytes()(无符号大端,不含符号位;负数需用a.Abs(a).Bytes()配合符号判断)。
性能与内存注意事项
math/big 是值语义 + 指针包装,底层使用动态分配的 uint 数组,因此频繁创建会导致 GC 压力:
- 复用对象:用
Set()重置已有*big.Int,而非反复new; - 避免短生命周期临时变量:例如循环内不要写
new(big.Int).Add(...),应提前声明并复用; - 大数运算本身较慢(尤其是除法和模幂),必要时可结合缓存或算法优化(如快速幂、Montgomery 模乘);
- 并发安全:
*big.Int本身无锁,多 goroutine 同时读写同一实例需自行加锁。
不复杂但容易忽略。关键在于习惯“对象复用”和“显式赋值”,把 big.Int 当作可变容器来用,而不是普通数值类型。










