当前位置: 首页 > 面试题库 >

使用Golang中的类型断言检测值超出范围的错误

锺星腾
2023-03-14
问题内容

给出以下代码:

    iv, err := strconv.ParseInt("18446744073709551448", 10, 64)
    fmt.Println(iv)
    fmt.Printf("%#v\n", err)
    fmt.Printf("%v\n", err)

    //Output:
    9223372036854775807
    &strconv.NumError{Func:"ParseInt", Num:"18446744073709551448", Err:(*errors.errorString)(0x1040a040)}
    strconv.ParseInt: parsing "18446744073709551448": value out of range

如何检测由于int64超出范围而导致函数失败?所述strconv.ParseInt函数返回一个错误类型,但在这种情况下,它实际上是一个strconv.NumError由所指示的类型%#v。该错误处理和围棋的文章中提到,您可以使用类型断言来检查特定类型的错误,但它不会给任何实例。我应该使用什么表达式来完成此代码

    if expression {
        uv, err := strconv.ParseUint("18446744073709551448", 10, 64)
    }

问题答案:

我们有,

软件包strconv

var ErrRange = errors.New("value out of range")

ErrRange指示值超出目标类型的范围。

type NumError struct {
        Func string // the failing function (ParseBool, ParseInt,

ParseUint, ParseFloat)
Num string // the input
Err error // the reason the conversion failed (ErrRange,
ErrSyntax)
}


一个NumError记录一个失败的转换。

func (e *NumError) Error() string

例如,

    package main

    import (
        "fmt"
        "strconv"
    )

    func main() {
        iv, err := strconv.ParseInt("18446744073709551448", 10, 64)
        if err != nil {
            if numError, ok := err.(*strconv.NumError); ok {
                if numError.Err == strconv.ErrRange {
                    fmt.Println("Detected", numError.Num, "as a", strconv.ErrRange)
                    return
                }
            }
            fmt.Println(err)
            return
        }
        fmt.Println(iv)
    }

输出:

检测到18446744073709551448为超出范围的值


 类似资料:
  • 问题内容: 我已经创建了一个基于字符串的角色类型,现在我想通过实现Valuer和Scanner接口使其与数据库驱动程序一起使用 我不断收到错误: 我在这里做错了什么? 问题答案: 这是第一个功能的工作代码: 尽管您可能希望使用并返回一个错误来代替恐慌。 a的签名不是您给的,而是: 请注意,这不会处理或产生NULL值。

  • 本文向大家介绍浅谈golang类型断言,失败类型断言返回值问题,包括了浅谈golang类型断言,失败类型断言返回值问题的使用技巧和注意事项,需要的朋友参考一下 失败的类型断言,返回的值为最近断言类型的零值 代码入下: 补充:go语言interface{}类型断言的举例使用 在go语言里经常会用到interface{}类型,它是类似于c语言中的void *类型,可以接受任意类型的参数。当我们的函数或

  • 问题内容: 我收到错误 BIGINT UNSIGNED值超出范围在’(1301980250 - 。。 )’ 当我运行查询 删除ORDER BY条件,也将删除错误。我该如何解决? 更新: 日期字段包含UNIX时间戳(例如:1298944082)。我将MySQL从5.0.x升级到5.5.x后开始出现错误 有什么帮助吗? 问题答案: 我最近遇到了这个问题,并找到了最合理的解决方案,可以将任何UNSIGN

  • 问题内容: 测试代码如下: 我认为输出将是:java,python,erlang,cpp,go;但是输出是:go go go go go; 怎么了 问题答案: 就是这样写函数,把动词变成函数

  • 问题内容: 目前,我正在使用Java处理数据类型,如果我正确理解该类型,则可以接受介于-9,223,372,036,854到+9,223,372,036,854,775,807之间的值。现在,你可以在下面看到,我创建了一个Long变量,名为,尽管当我将9223372036854775807插入为值时,我收到一条错误消息: “ int类型的文字9223372036854775807超出范围。” 我不

  • 问题内容: 数据输入: 存储过程的相关部分: 错误:将varchar数据类型转换为datetime数据类型导致值超出范围。 这是CONVERT(DATETIME)的唯一调用,并且我不使用CAST 如果我只是直接传递数据,则会插入该行。如果我运行该存储过程,它将超出范围。 问题答案: 在SQL Server中使用的安全日期时间字符串格式为 或。 如果SET DATEFORMAT为dmy,则转换将失败