给出以下代码:
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。该错误处理和围棋的文章中提到,您可以使用类型断言来检查特定类型的错误,但它不会给任何实例。我应该使用什么表达式来完成此代码:
%#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
软件包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为超出范围的值