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

标签 go type-assertion strconv

给定以下代码:

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 的指示输入。 Error Handling and Go文章提到您可以使用类型断言来检查特定类型的错误,但它没有给出任何示例。我应该使用什么表达式来完成这段代码:

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

最佳答案

我们有,

Package strconv

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

ErrRange indicates that a value is out of range for the target type.

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

A NumError records a failed conversion.

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

输出:

Detected 18446744073709551448 as a value out of range

关于go - 在 Golang 中使用类型断言检测值超出范围错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28977718/

相关文章:

go - 解析数字字符串数字

go - 为什么我会收到 Go error "panic: strconv: illegal AppendInt/FormatInt base"

go - 特定于体系结构的结构的通用变量

windows - Golang fmt.Print ("\033c") 和 fmt.Print ("\x1bc") 没有清除屏幕(ANSI Escape 代码不起作用)如何修复?

eslint - 无法关闭 eslint no-unused-expressions

Golang : cast an interface to a typed variable dynamically

concurrency - Golang channel 选择语句

node.js - 在 MongoDB 中保存纳秒时间戳(由 Go 生成,使用 Node.js 保存)

callback - 如何对 interface{} 变量进行类型断言以测试它是否是函数?

java - 是否有相当于 VB6 Strconv 的 Java(Android)