在golang里面如果 a + b 或者 a * b 发生溢出时,程序不会报错,会直接得到一个错误的结果,如果程序有大数计算需要做边界检查
//支持自增的溢出检查的方法
func IncrInt(x int) int {
if x == math.MaxInt {
panic("overflow")
}
return x + 1
}
//支持加法的溢出检查的方法
func AddInt(a, b int) int {
if a > math.MaxInt-b {
panic("overflow")
}
return a + b
}
//支持乘法的溢出检查的方法
func MultiplyInt(a, b int) int {
if a == 0 || b == 0 {
return 0
}
if (a*b)/a != b {
panic("overflow")
}
return a * b
一个类型一种类型方法检查,但是有些朋友说类型这么多,为什么不写一个统一的泛型方法,因为在go语言中是不支持断言类型匹配的
func Foo[T int32 | int](n T) {
switch v := n.(type) {
case int:
case int32:
fmt.Println(v)
}
上面这种写法是不能编译通过的。既然不能知道实际类型就不能用 math.MaxInt 的值,自然不能通用的去匹配。