Go 语言在自增时如何检测整数溢出?

题目描述

如果我想在使用基于定义大小的类型(int8、int16、int32、int64、uint8、uint16、uint32或uint64)的自增量时检测整数溢出, 能否有一个好的方法,目前想到这个:

package main

import (
    "fmt"
    "math"
)

func increInt(count int64) int64 {
    if count == math.MaxInt64 {
        panic("int64 overflow")
    }
    return count + 1
}

func main() {

    fmt.Println(increInt(1))
    fmt.Println(increInt(999999999999999999))
    fmt.Println(math.MaxInt64)
    fmt.Println(increInt(9223372036854775807)
}

运行上述代码:

2
1000000000000000000
9223372036854775807
panic: int64 overflow

goroutine 1 [running]:
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。
阅读 1.6k
2 个回答

抛出错误使用recover, 直接panic程序会停止, 也可以使用Errors包
例子:

package main

import (
    "fmt"
    "time"
)

func test() {
    for i := 0; i < 10; i++ {
        time.Sleep(time.Second)
        fmt.Println("你好,大妹子,我是你表哥")
    }
}

func test2() {
    //测试一个异常goroutine
    //使用defer+recover捕获异常
    defer func() {
        //匿名函数来捕获异常
        if err := recover(); err != nil {
            fmt.Println("test2函数出错,", err)
        }
    }()

    //主动模拟异常,对一个未初始化的map赋值,引出panic异常
    var myMap map[int]string
    myMap[0] = "你妹呀"
}

func main() {
    go test()
    go test2()

    time.Sleep(time.Second * 10)
}
本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

对于你的使用场景也可以这样写,这里只会产生下溢

func increInt(count int64) int64 {
    if count > count + 1 {
        panic("int64 overflow")
    }
    return count + 1
}

如果是是其他场景:

func add(a, b int) (int, bool) {
    c := a + b
    if (a > 0 && b > 0 && c < 0) || (a < 0 && b < 0 && c > 0) {
        return 0, true // 溢出发生了
    }
    return c, false // 没有溢出
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏