如何在Go中将big.Int转换为常规整数(int、int32、int64)
Go中big.Int转int/int32/int64的正确方法
Go里确实没法直接用强制类型转换把big.Int转成常规整数类型——因为big.Int是个结构体,不是基本数值类型,编译器不支持这种隐式转换。你得用它自带的方法来处理,同时还要注意溢出问题:
转int64
用Int64()方法,它会返回两个值:转换后的int64,以及一个布尔值表示转换是否成功(也就是原数有没有超出int64的范围):
import "math/big" var bigVal big.Int // 先给bigVal赋值,比如bigVal.SetInt64(12345) val64, ok := bigVal.Int64() if !ok { // 这里处理溢出情况,比如原数太大/太小,超出int64能表示的范围 panic("big.Int value exceeds int64 range") } // 现在val64就是可用的int64类型值
转int32
没有直接的Int32()方法,所以先转int64,再判断是否在int32的范围内:
import ( "math" "math/big" ) var bigVal big.Int val64, ok := bigVal.Int64() if !ok || val64 < math.MinInt32 || val64 > math.MaxInt32 { panic("big.Int value exceeds int32 range") } val32 := int32(val64)
转int
int的大小取决于系统(32位系统是4字节,64位是8字节),所以同样先转int64,再判断是否符合当前系统int的范围:
import ( "math" "math/big" ) var bigVal big.Int val64, ok := bigVal.Int64() if !ok { panic("big.Int value exceeds int64 range") } if val64 < math.MinInt || val64 > math.MaxInt { panic("big.Int value exceeds int range") } val := int(val64)
补充说明
Go这么设计不是故意复杂,而是因为big.Int的核心作用就是处理超出常规整数范围的大数。如果直接隐式转换,很容易出现数据丢失的情况,所以Go强制要求开发者显式处理溢出风险——和C#里转的时候抛异常的思路不同,Go把控制权交给了你,让你自己决定溢出时该怎么处理。
内容的提问来源于stack exchange,提问作者Cade Bryant
相关产品推荐
相关产品推荐

