给定以下代码:
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)
}
最佳答案
我们有,
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/