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 判断相等。与基础类型互转需显式处理,避免隐式截断风险:
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(...),应提前声明并复用;*big.Int 本身无锁,多 goroutine 同时读写同一实例需自行加锁。不复杂但容易忽略。关键在于习惯“对象复用”和“显式赋值”,把 big.Int 当作可变容器来用,而不是普通数值类型。