我无法从strconv包访问err.Err

时间:2016-09-23 18:46:47

标签: go error-handling

我可能在这里遗漏了一些非常简单的东西:

package main

import (
    "fmt"
    "strconv"
    "reflect"
)

func main() {
    s := "abd"
    fmt.Println(s)
    _, err := strconv.Atoi(s)
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println(reflect.TypeOf(err))

    fmt.Println(err.Err)

}

我正在尝试提取错误本身,例如ErrSyntaxErrRange,但我无法这样做。

看了之后:

https://golang.org/src/strconv/atoi.go?s=3604:3671#L16

我看到err是指向strconv.NumError

的指针
    15  // A NumError records a failed conversion.
    16  type NumError struct {
    17      Func string // the failing function (ParseBool, ParseInt, ParseUint, ParseFloat)
    18      Num  string // the input
    19      Err  error  // the reason the conversion failed (ErrRange, ErrSyntax)
    20  }

Err是包含ErrRange ErrSyntax {}的字段。因此,我认为err.Err会起作用,但我得到:

err.Err undefined (type error has no field or method Err

Err是公开的,我是否遗漏了可见性规则?

我错过了什么?

1 个答案:

答案 0 :(得分:4)

使用type assertion获取*strconv.NumError值:

if e, ok := err.(*strconv.NumError); ok {
    fmt.Println("e.Err", e.Err)
}

playground example