一尘不染

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

go

给出以下代码:

    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)
    }

阅读 302

收藏
2020-07-02

共1个答案

一尘不染

我们有,

软件包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为超出范围的值
2020-07-02