结论:Go 没有支持 +- 运算符的 big int 库
Go 语言在设计上明确不支持运算符重载,这是语言层面的限制,不是库能解决的问题。
为什么没有?
- 语言设计哲学:Go 的设计者(Rob Pike、Ken Thompson、Robert Griesemer)明确反对运算符重载,认为它会: - 降低代码可读性 - 隐藏复杂操作(如内存分配) - 增加语言复杂度
- 即使有泛型也不行:Go 1.18+ 引入了泛型,但仍然不允许运算符重载。泛型只支持类型约束,不支持自定义运算符行为。
- 标准库的做法:math/big 作为官方标准库,也只能用方法调用(.Add(), .Sub()),这已经是 Go 中处理大整数的"标准答案"。
其他语言对比
- 支持运算符重载:Python(add)、C++、Rust、Scala
- 不支持:Go、Java(除了 String 的 +)
当前代码是最佳实践
您当前的实现:
v4availableIPs = util.AddressCountBigInt(v4CIDR).Sub(util.CountIPNumsBigInt(v4toSubIPs)).Sub(usingIPs)
这已经是 Go 中最简洁、最符合习惯的写法了。没有更好的替代方案。